Frage

Wenn ich so etwas wie ein UILabel zu einer xib Datei verknüpft haben, muss ich um sie lösen auf dealloc meiner Ansicht? Der Grund, warum ich frage ist, weil ich es nicht tun Alloc, das mache ich glaube, ich brauche es auch nicht veröffentlichen? zB (im Header):

IBOutlet UILabel *lblExample;

bei der Umsetzung:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}
War es hilfreich?

Lösung

Wenn Sie folgen, was jetzt als beste Praxis, Sie sollte Freigabe Ausgang Eigenschaften, weil man sie im Set Accessor beibehalten haben sollte:

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

Der Vorteil dieses Ansatzes besteht darin, dass es die Speicherverwaltung Semantik explizit und klar macht, und es funktioniert konsequent über alle Plattformen hinweg für alle nib Dateien .

Hinweis: Die folgenden Ausführungen beziehen sich nur auf iOS vor 3,0. Mit 3.0 und höher, sollten Sie stattdessen einfach nil out Eigenschaftswerte in ViewDidUnload.

Eine Überlegung hier aber ist, wenn der Controller seiner Benutzeroberfläche verfügen könnte und legen Sie es dynamisch nach Bedarf (zum Beispiel, wenn Sie einen View-Controller haben, die eine Ansicht aus einer Nib-Datei lädt, aber auf Anfrage - sagen unter Speicherdruck - freigibt, mit der Erwartung, dass es, wenn die Ansicht wieder benötigt wird, neu geladen werden kann). In dieser Situation wollen Sie sicherstellen, dass, wenn die Hauptansicht von Ihnen auch Eigentum an anderen Verkaufsstellen verzichten angeordnet ist, so dass sie auch freigegeben werden können. Für UIViewController, können Sie sich mit diesem Thema befassen sich durch zwingende setView: wie folgt:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

Leider führt dies zu einem weiteren Problem. Da UIViewController derzeit seine dealloc Verfahren unter Verwendung des setView: Accessormethode implementiert (und nicht nur die Variable direkt losgelassen wird), wird self.anOutlet = nil in dealloc genannt werden, sowie in Reaktion auf eine Speicher Warnung ... Dies wird zu einem Absturz in dealloc führen.

Das Heilmittel ist, dass Austrittsgrößen sicherzustellen, auch in nil dealloc gesetzt:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}

Andere Tipps

fand ich, was ich in dem Apple-docs suchen. Kurz gesagt: Sie können Ihre Objekte als Eigenschaften, die Sie freigeben und halten (oder nur @property, @synthesize), aber Sie haben nicht für Dinge wie UILabels ein:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

Das

[anOutlet release], anOutlet = nil;

Ein Teil ist völlig überflüssig, wenn Sie setView geschrieben haben. Richtig

Wenn Sie entbinden nicht auf dealloc es wird den Speicherbedarf zu erhöhen.

Siehe

mehr Detail hier mit Instrumente ObjectAlloc graph

Sie tun das Etikett Alloc, in gewissem Sinne, indem sie sie in IB zu schaffen.

Was IB Fall ist, wird bei Ihrem IBOutlets aussehen und wie sie definiert sind. Wenn Sie eine Klassenvariable, die IB ist eine Referenz auf ein Objekt zuweisen, wird IB a behalten Nachricht für Sie zu diesem Objekt.

Wenn Sie Eigenschaften verwenden, wird IB Nutzung der Immobilie machen Sie den Wert gesetzt und nicht explizit den Wert behalten. So würden markieren Sie in der Regel IBOutlet Eigenschaften behalten:

@property (nonatomic, retain) UILabel *lblExample;

So in Ether Fall (unter Verwendung von Eigenschaften oder nicht) Sie Freigabe in Ihrem dealloc nennen sollten.

Jede IBOutlet, die ein Subview Ihrer Nib Hauptansicht ist muss nicht veröffentlicht werden, weil sie die Autofreigabemeldung bei der Objekterstellung gesendet werden. Die einzige IBOutlet die müssen Sie in Ihrem dealloc lösen sind Top-Level-Objekte wie Steuerungen oder andere NSObject ist. Dies alles geschieht in der Apple-doc oben verlinkten erwähnt.

Wenn Sie setzen nicht die IBOutlet als Eigenschaft, sondern einfach als eine Instanz-Variable, müssen Sie es noch freigeben. Dies liegt daran, auf initWithNib, wird Speicher für alle IBOutlets zugeordnet werden. Das ist also eine der besonderen Fälle, die Sie freigeben müssen, auch wenn Sie nicht erhalten haben oder einen Speicher in Code alloc'd.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top