13 Stimmen

Delegierte - beibehalten oder abtreten - freistellen?

Ich habe eine Reihe von Beiträgen zum Thema Delegierte gesehen und würde gerne wissen, wie man sie richtig referenziert. Angenommen, ich habe ein Objekt deklariert wie:

@interface MyViewController : UITableViewController {
    id delegate;    
}
@property (nonatomic, retain) id delegate;
@end

Während des gesamten Lebenszyklus von MyViewController wird es als Reaktion auf die Interaktion mit dem Benutzer Methoden seines Delegaten aufrufen.

Wenn es an der Zeit ist, eine Instanz von MyViewController ist die delegate ivar sein müssen release in der Umsetzung der dealloc Methode, da sie mit retain ?

Oder andersherum, sollte delegate überhaupt beibehalten werden? Vielleicht sollte es sein @property (nonatomic, assign) id delegate ? Nach Angaben von Apples Dokumente :

beibehalten ... Sie verwenden dieses Attribut in der Regel für skalare Typen wie NSInteger und CGRect oder (in einer Umgebung mit Referenzzählung) für Objekte, die Sie nicht besitzen, wie z. B. Delegates.

Normalerweise würde ich mich einfach an das halten, was die Dokumentation sagt, aber ich habe eine Menge Code gesehen, der retain auf einen Delegaten. Ist dies nur "schlechter Code"? Ich verlasse mich hier auf die Experten... Was ist der richtige Weg, um dies zu behandeln?

21voto

Simon Whitaker Punkte 20381

Im Allgemeinen möchten Sie Delegaten eher zuweisen als sie zu behalten, um zirkuläre Retain-Zählungen zu vermeiden, bei denen Objekt A Objekt B behält und Objekt B Objekt A behält. Betrachten Sie zum Beispiel das folgende allgemeine Muster:

-(void)someMethod {
    self.utilityObject = [[[Bar alloc] init] autorelease];
    self.utilityObject.delegate = self;
    [self.utilityObject doSomeWork];
}

wenn die utilityObject y delegate Eigenschaften werden beide mit retain entonces self behält nun self.utilityObject y self.utilityObject behält self .

Véase Warum erhalten Objective-C-Delegierte in der Regel die Eigenschaft assign anstelle von retain? um mehr darüber zu erfahren.

Wenn Sie den Delegaten zuweisen, anstatt ihn zu behalten, müssen Sie sich nicht darum kümmern, ihn bei der Deallokation freizugeben.

1voto

Jonathan Grynspan Punkte 43004

Es ist in der Regel ein Hinweis auf ein schlechtes Design, da die meisten Delegaten ihre Objekte behalten (wodurch das Potenzial für Retain-Schleifen und somit Lecks entsteht). Dies sind in der Regel Fälle, in denen kein Verweis auf das Objekt verfügbar ist, so dass der Delegierte nicht derjenige sein kann, der es behält - aber auch das kann manchmal auf ein schlechtes Design hinweisen.

0voto

Dan Ray Punkte 21465

Auch dazu habe ich schon viele Meinungen gehört. Ich kenne nicht den richtigen Weg, aber ich kann Ihnen sagen, was ich durch meine eigene Arbeit herausgefunden habe.

Sie wollen retain alles, was Sie im Griff behalten müssen. Das ist alles, was Eigentum in einer Umgebung mit Referenzzählung bedeutet. Es ist eine Erklärung, die besagt: "Ich brauche das später, lass es nicht einfach verschwinden".

Das bedeutet auch, dass Sie für die Freigabe Ihrer Forderung verantwortlich sind. Wenn Sie das nicht ausdrücklich tun, sind Sie anfällig für verschiedene Probleme, vor allem aber für den Umgang mit Delegaten, die das Objekt, dessen Delegat sie sind, durchaus behalten könnten. Wenn Sie sich nicht um die Beibehaltung des Delegaten kümmern, wird die Eigentümerschaft zyklisch sein und die Objekte werden auslaufen. Vergessen Sie aber nicht, das, was Sie behalten, wieder freizugeben, und es wird Ihnen nichts passieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X