iOS-Programmierung - Weak Delegate



  • Hallo,

    mich beschäftigt gerade die Frage: Wieso sollten Delegates in Objectiv-C
    als Weak deklariert werden? Habe zwar im Internet paar Antworten gefunden, leider nur auf English und sehr abstrakt.

    Kann hier jemand weiterhelfen?



  • Ich vermute um Zyklen zu vermeiden, da Objective-C im "retain count" Mode keine Zyklen collecten kann.



  • Das mit den Zyklen verstehe ich ja soweit und sollten auch bei Verwendung von Selbst definierten Collections beachtet werden.
    - Strong auf Next Node
    - Weak auf Pre Node

    Aber mir fehlt das Verständis für schwache Delegates im Zusammenhang mit dem MVC-Pattern. Wie könnte dort eine zyklische Abhängigkeit erreicht werden?

    @property(weak) id delegate<SomeDelegate>;

    Anwort auf Stackoverflow: http://stackoverflow.com/a/8449146



  • Angenommen du hast zwei Objekte, FooModel und FooController (die View beachten wir einfach mal nicht).

    FooController hält nun eine Referenz auf FooModel - der Controller muss ja das Model ansprechen können.
    Und FooModel hält eine Referenz auf seinen Delegate, denn es muss den Delegate ja benachrichtigen können wenn sich eine Eigenschaft geändert hat.

    Und jetzt setzt FooController sich selbst als Delegate im FooModel Objekt.

    Du hast also eine Referenz von FooController zu FooModel und eine Referenz von FooModel zum FooController. Und das ist der Zyklus.

    Diesen Zyklus muss man nun aufbrechen.
    Dazu könnte man nun entweder die Referenz vom Controller zum Model "weak" machen, oder eben den Delegate im Model.

    Wenn man die Referenz im Controller "weak" macht, dann kann es passieren dass dem Controller sein Model einfach so unter dem Hintern weg gelöscht wird. Das wäre doof.

    Wenn man dagegen den Delegate im Model "weak" macht, dann kann es schlimmstenfalls passieren dass der Delegate gelöscht wird. Nur wenn es den Delegate nicht mehr gibt, dann ist es auch egal wenn das Model ihn nicht mehr benachrichtigen kann.
    Und daher vermutlich die Faustregel dass man alle Delegates "weak" machen sollte.
    Weil es Zyklen vermeidet ohne dass dabei die Gefahr entsteht dass ein Objekt zu früh gelöscht werden würde.



  • Ok, habe mir das mal Skizziert...und so langsam wird es heller. Werde versuchen
    das im xCode zu beobachten ! 😃

    Ich danke dir für die Erklärung 👍


Anmelden zum Antworten