Wird ein Delegierter beibehalten?

8

Ich weiß, der Delegierte wird nie behalten! Immer!

Aber kann mir jemand erklären, warum Delegierte nie behalten werden? ...

Danke im Voraus

    
Kalpesh 20.12.2012, 12:29
quelle

4 Antworten

14

Es ist eine Sache der Speicherverwaltung.

Objective-C arbeitet mit Referenzzählungen, um den Speicher sauber zu halten. Dies bedeutet, dass es keine zyklischen Beziehungen erkennen kann.

Beispiel:

  • Objekt A besitzt Objekt B. Objekt B wird von Objekt A beibehalten.
  • Objekt B hat einen Delegaten, der Objekt A ist. Objekt A wird von Objekt B beibehalten.
  • Objekt C besitzt Objekt A. Objekt A wird von Objekt C beibehalten.
  • Objekt A hat jetzt einen retainCount von 2 und Objekt B hat einen retainCount von 1
  • Objekt C wird freigegeben und gibt Objekt A
  • frei
  • Objekt A und B haben jetzt einen retainCount von 1, weil sie sich gegenseitig besitzen. Das System wird sie nicht freigeben, da das RetainCount immer noch 1 ist (immer noch im Besitz eines anderen Objekts)
  • Speicherleck!
Tom van der Woerdt 20.12.2012, 12:33
quelle
3

Es liegt an dir. Wenn Sie es als beibehalten erklären ( strong in ARC), wird es beibehalten.

Die Regel besteht darin, sie nicht beizubehalten, da sie bereits an anderer Stelle gespeichert wurde und wichtiger ist Sie vermeiden Aufbewahrungszyklen .

    
djromero 20.12.2012 12:32
quelle
2

Um die Antwort von djromero zu erweitern:

Wenn Sie ein UIViewController haben, das ein UITableView enthält, behält der Controller höchstwahrscheinlich die Tabelle und es ist ihre Delegate / dataSource. Wenn die Tabelle die delegate / dataSource beibehält, behalten sie sich gegenseitig bei und werden daher niemals freigegeben.

    
Ismael 20.12.2012 12:34
quelle
1

Die ganze Idee ist, dass der Delegat immer das Objekt überleben sollte, das ihn als Delegierten zuweist. Die Webansicht wird also vor dem zugewiesenen Delegaten freigegeben.

    
Trausti Thor 20.12.2012 12:33
quelle

Tags und Links