2009-04-18 15 views
9

Dieser Code ist ziemlich einfach, ist es richtig? Ich weiß nicht, ob ich den über die init-Methode übergebenen Delegierten behalten sollte.Frage über Delegierte

Mein erster Gedanke ist nein, jedoch scheint dieses Bit Code sonst zu deuten. Ich weiß, dass ich mich nicht auf Rücklagen verlassen kann, aber ich würde gerne wissen, wie man mit Delegierten richtig umgehen kann.

+1

NSURLConnection ist ein bisschen ein besonderer Fall. Es ist nicht so sehr, dass es den Delegaten behält, sondern dass es _ für die Dauer der Verbindung_ beibehält, da der einzige Weg, um das Empfangen von Delegiertennachrichten zu stoppen, das Abbrechen der Verbindung ist. Normalerweise behält man keinen Delegaten, und das Verhalten von NSURLConnection ist ein Implementierungsdetail; Nicht etwas, auf das du dich verlassen solltest oder das du im Allgemeinen nachahmst. Außerdem ist es ungewöhnlich, eine Delegate _class_ zu haben. Normalerweise deklarieren Sie ein Delegate-Protokoll. –

+0

Danke Mike, das erklärt, was ich sehe. – Jab

Antwort

11

Nein, im Allgemeinen sollten Sie den Delegaten nicht behalten. Da der Delegat bereits eine Referenz auf Ihr Objekt hat, würden Sie, wenn Sie den Delegaten behalten würden, im Wesentlichen eine Zirkelreferenz erstellen. Aus demselben Grund können Sie auch davon ausgehen, dass Ihr Objekt zerstört wird, bevor der Delegat zerstört wird.

Weitere Informationen zum Verwenden/Implementieren von Delegaten finden Sie unter thesearticles.

EDIT: Es gibt ein paar Ausnahmen, auf die von anderen hingewiesen wurden.

+0

Vielen Dank für die Artikel, Sie haben meine Überzeugung über die Delegierten bestätigt. Mike erklärte mir auch, warum ich sehe, was ich mit NSURLConnection in den Kommentaren meiner Frage sehe. – Jab

+2

Je nach Situation wird Ihr Objekt möglicherweise nicht zuerst zerstört, aber der Delegat wird mindestens deaktiviert. (Beispiel: UIAccelerometer) – rpetrich

1

Wie htw sagt, sollten Sie den Delegierten nicht generell behalten. In einer Umgebung mit mehreren Threads müssen Sie häufig alles beibehalten, was Sie benötigen, selbst wenn Sie nur für einen Methodenaufruf arbeiten, um sicherzustellen, dass es nicht hinter Ihrem Rücken ungültig wird. Wenn zum Beispiel (nicht wirklich der Fall), der -[NSURLConnection initWithRequest:delegate] einen neuen Thread erstellt hat, der Thread (dann wird wahrscheinlich Autorelease) seine Parameter beibehalten haben. In Wirklichkeit ist NSURLConnection ein Sonderfall, in dem es seinen Delegierten für die Dauer der Verbindung behält.