Müssen Sie IBoulets in dealloc freigeben? Ich bin mir da nicht sicher, weil ich das Alloc nicht gemacht habe und normalerweise nur für etwas freigegeben habe, auf das du Alloc ankommst. Weiß jemand?Müssen Sie IBoulets in dealloc freigeben?
Antwort
Ihre IBOutlets sind wahrscheinlich @properties
. Wenn sie sind, und Sie haben retain
als Attribut, dann brauchen Sie in -dealloc
Mit anderen Worten zu lösen:
@interface MyViewController : UIViewController {
IBOutlet UITableView *myTable;
}
@property (nonatomic, retain) IBOutlet UITableView *myTable;
@end
Sie zu [myTable release];
in Ihrem dealloc haben.
Wenn Sie eine neue Navigation Based App in Xcode machen, und suchen Sie im appdelegate.h:
@interface Untitled1AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@end
und der dealloc für appdelegate.m:
- (void)dealloc {
[navigationController release];
[window release];
[super dealloc];
}
Der Schlüssel ist daran zu sehen Hier sind Zeilen wie diese:
Wenn dort ein behalten ist, bedeutet das, dass die Eigenschaft ist " Besitz "durch Ihren Code und Sie müssen es freigeben.
Natürlich gibt es andere Möglichkeiten, wie die IBOutlets nicht als Eigenschaften deklarieren oder als Eigenschaften deklarieren, ohne sie zu behalten. Ich finde, dass ich es in den meisten Fällen bevorzuge, Eigenschaften zu behalten, die ich dann explizit freigeben muss. Ein Beispiel hierfür ist, wenn Sie von einem Ansichtscontroller zu einem anderen wechseln. Wenn ein Ansichtscontroller geschlossen wird, werden seine Ansichten entfernt und sie werden freigegeben. Alle IBOutlet UILabels in dieser Ansicht werden ebenfalls freigegeben, wenn sie nicht beibehalten werden. Das bedeutet, dass wenn ich zur alten Ansicht zurück blicke, ich meine Etiketten und Kontrollen auf ihre letzten Werte zurücksetzen muss, wenn ich sie einfach gespeichert hätte, wenn ich nur das IBOutlet behalten würde.
Wie Sie gesagt haben, sollten Sie alles, was Sie selbst zugewiesen haben, freigeben (mit alloc
oder copy
). Es funktioniert auch anders herum: Sie sollten keine Cocoa-Objekte freigeben, die Sie nicht selbst zugewiesen haben (einige CoreFoundation-Funktionen weisen sie zu und Sie sind für deren Freigabe verantwortlich, aber das ist hier nicht der Fall).
Wenn Sie Ihr IBOutlet nicht zugewiesen haben, müssen Sie es nicht freigeben, es sei denn, Sie haben es aus irgendeinem Grund irgendwo gespeichert.
Schlüsselwort ist ("es sei denn .. du hast es irgendwo"), was passieren wird, wenn Sie Verwenden Sie eine Eigenschaft (nicht atomisch, behalten). – Fraggle
Es geht nicht um IBOutlet, es geht um Ihre Deklaration. Wenn Sie einen neuen Projektassistenten in Xcode verwenden, erhalten Sie in der Header-Datei wahrscheinlich einen Code wie diesen.
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
Sie sehen können, gibt es Schlüsselwort in der Header-Datei beibehalten. Gemäß der Speicherverwaltungsrichtlinie MÜSSEN Sie alles freigeben, was Sie behalten (indem Sie alloc aufrufen, kopieren, behalten usw.). Und Sie haben behalten in Ihrem Code dann müssen Sie Release es.
Zusätzlich fügt der Assistent bereits einen Release-Code für Sie hinzu.
- (void)dealloc {
[tabBarController release];
[window release];
[super dealloc];
}
Wenn Sie nur IBOutlet in Ihrer Schnittstelle verwenden, müssen Sie sie NICHT freigeben. Grund ist, dass, wenn Sie sie nicht explizit in Ihrem Code behalten, sie nur gesetzt werden. Sie bleiben herum, weil die Aussicht da ist. Offensichtlich müssen Sie, wenn Sie auch Eigenschaften verwenden und diese beibehalten, auf dealloc freigeben.
Steht diese Antwort nicht im Widerspruch zu der obigen? Müssen Sie oder nicht? So verwirrt. – erotsppa
Nein, es ist nicht widersprüchlich: "Natürlich, wenn Sie auch Eigenschaften verwenden und behalten, müssen Sie auf dealloc freigeben". – mahboudz
Als Test, erstellen Sie eine neue Nav-basierte App in Xcode. Sie werden sehen, wie sie IBOutlets in ihrem Dealloc freigeben. – mahboudz
Hier ist, was ich habe im Hinblick auf IBOutlet
Objekte zu tun (in Verbindung mit einer NIB-Datei):
@interface MyViewController : UIViewController {
UILabel *label;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@end
@implementation MyViewController
@synthesize label;
- (void)setView:(UIView *)aView {
if (!aView) {
// view is being set to nil
// set outlets to nil to get the benefit of the didReceiveMemoryWarning!
self.label = nil;
}
// Invoke super's implementation last
[super setView:aView];
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.label = nil;
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)dealloc {
[label release];
[super dealloc];
}
Side Frage: Macht es mehr Sinn macht self.label = nil
in dealloc zu verwenden, oder muss release
explizit sein genannt (zum Beispiel, um den statischen Analysator glücklich zu halten)?
Ich nehme an, an diesem Punkt sind wir sowieso auf dem Weg nach draußen, also müssen wir unsere IBOutlet-Objekte nicht auf null setzen.
Wenn dies Ihr BlahViewController.h ist:
// BlahViewController.h
#import <UIKit/UIKit.h>
@interface BlahViewController
{
IBOutlet UINavigationBar *navigationBar;
}
@property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar;
@end
Dann würde dies Ihr dealloc
in BlahViewController.m sein:
- (void)dealloc
{
[navigationBar release];
[super dealloc];
}
jedoch, wenn dies Ihre BlahViewController.h ist:
// BlahViewController.h
#import <UIKit/UIKit.h>
@interface BlahViewController
{
IBOutlet UINavigationBar *navigationBar;
}
@end
Dann wäre dies Ihre dealloc
in BlahViewC ontroller.m:
- (void)dealloc
{
[super dealloc];
}
Und schließlich, wenn dies Ihr BlahViewController.h ist:
// BlahViewController.h
#import <UIKit/UIKit.h>
@interface BlahViewController
{
IBOutlet UINavigationBar *navigationBar;
IBOutlet MKMapView *map;
}
@property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar;
@end
Dann würde dies Ihr dealloc
in BlahViewController.m sein:
- (void)dealloc
{
[navigationBar release];
[super dealloc];
}
Kurz gesagt, Wenn Sie es als eine Eigenschaft mit retain
deklarieren, dann müssen Sie es freigeben.
Um die Nebenfrage von Joe D'Andrea zu beantworten. Sie können self.label = nil;
verwenden. Weil es setLabel ruft, die automatisch generiert wird:
- (void)setLabel:(UILabel *)input
{
[label autorelease];
label = [input retain];
}
Wie Sie die aktuelle label
dann freigegeben werden sehen nil
zu Etikett zugeordnet ist.
Aber stellen Sie sicher, dass Sie es nicht als label = nil
schreiben. Das wird nicht funktionieren. Da müssen Sie die automatisch generierte Label-Accessor-Methode aufrufen.
- 1. Sollte ich ein IBOultet in meiner Dealloc-Funktion freigeben?
- 2. Müssen Sie GCD-Warteschlangen unter ARC in iOS 6.0 freigeben?
- 3. Subviews freigeben
- 4. ARC Referenzzählung Dealloc und Release
- 5. Warum kein Speicherleck für: @property (copy) NSString * name, wenn ich es nicht in Dealloc freigeben?
- 6. [Self-Release], [Self-Dealloc] oder [Super Dealloc] in Init-Methoden?
- 7. Eigenschaften in Dealloc: Release dann auf Null gesetzt? oder einfach
- 8. Objective-C: Müssen Sie Eigenschaftsobjekte aufheben, bevor Sie das übergeordnete Objekt freigeben?
- 9. Müssen Sie Parameter von Methoden am Ende von ihnen in Objective-C freigeben?
- 10. iPhone dealloc und viewDidUnload Problem
- 11. Muss ich Xib-Ressourcen freigeben?
- 12. Dealloc wird nicht aufgerufen
- 13. Verwenden Sie nicht Accessor-Methoden in Initialisierungsmethoden und Dealloc
- 14. Freigabe in viewDidUnload und dealloc beides?
- 15. Einstellungen IBOutlets zu Null in Dealloc
- 16. Release, Dealloc und die Selbstreferenz
- 17. UIView und NSTimer nicht freigeben Speicher
- 18. Problem mit dem Freigeben eines Objekts
- 19. Warum stürzt UITableView App in Dealloc ab?
- 20. Was ist dealloc in objective C
- 21. IOS Dealloc wird nie aufgerufen
- 22. Können Sie eine Unterstruktur erstellen, wenn Sie ein Projekt freigeben?
- 23. UINavigationController: Wann erhält eine Pushed-Ansicht die Dealloc-Nachricht?
- 24. Verstehen, wann Sie anrufen müssen, um ein Objekt beizubehalten?
- 25. Wie Sie Objekte aus dem Speicher freigeben
- 26. Wie Sie die Anzahl der Kerne und Prozessoren in Python steuern, wenn wir den Status zwischen Prozessen freigeben müssen
- 27. Unteransichten freigeben
- 28. UITabBarController Sichten nach Speicherwarnung freigeben
- 29. sperren/freigeben Scrollen in UIPageViewController
- 30. Freigeben von Dateien in SVN
Duplizieren: http://stackoverflow.com/questions/61838/do-i-need-to-release-xib-resources – Casebash