Ich halte die Dokumentation zu diesem Thema für unklar:
Nehmen wir an, Sie arbeiten mit iOS (NICHT der Mac-Fall, die Unterschiede müssen nicht erwähnt werden). Nehmen wir an, es handelt sich ausschließlich um 4.0+ (Unterschiede im alten Betriebssystem müssen nicht erwähnt werden). Angenommen, wir laden die NIB ausschließlich automatisch.
Angenommen, Sie haben einen UIViewController, BigView. Sagen wir, es gibt ein Dutzend sogenannter "Top-Level"-Elemente in der NIB-Datei... das können benutzerdefinierte Steuerelemente, Bilder oder etwas anderes sein.
Nehmen wir an, Sie wollen BigView explizit erstellen und dann mehrmals während der Laufzeit der Anwendung wieder loswerden. Also:
Für einen dieser Top-Level-Elemente in der NIB gibt es drei Möglichkeiten :
(1) Sie haben keinerlei IBOutlet dafür.
(2) Sie haben ein verbundenes IBOutlet - aber keine Eigenschaft.
(3) Sie haben eine verknüpfte IBOutlet-Eigenschaft (um Verwirrung zu vermeiden, sagen wir eine Retain-Eigenschaft).
Was passiert also mit dem Gegenstand, wenn BigView freigegeben wird?
Im Fall von (3) scheint es klar zu sein, dass Sie ausdrücklich freigeben müssen. Wenn Sie das nicht tun, bleibt die Funktion bestehen, nachdem die Ansicht verschwunden ist. Kein Problem.
Im Fall von (1) Ich nehme an ( aber kann das jemand bestätigen? ), dass der Artikel freigegeben wird, wenn BigView nicht mehr verfügbar ist.
Im Fall von (2) Es ist nicht klar, was passiert.......
Ein Blick auf den bekannten Referenzlink: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html ist das sehr zweifelhaft:
"In iOS verwendet der Code zum Laden der Feder die Methode setValue:forKey:, um jeden Ausgang wieder anzuschließen. Diese Methode sucht ebenfalls nach einer geeigneten Accessor-Methode und [SO WHAT HAPPENS IF THERE ISN'T ONE?? TELL US APPLE...] greift auf andere Mittel zurück, wenn das fehlschlägt...[GOOD GRIEF!]"
Und scrollen Sie nach unten zu "Nib Object Retention":
"Objekte in der Nib-Datei werden mit einem Retain Count von 1 erstellt und dann automatisch wieder freigegeben" Fantastisch.
Doch halt! Lesen Sie ein paar Worte weiter...
der jedoch die verfügbare Setter-Methode verwendet oder das Objekt standardmäßig beibehält, wenn keine Setter-Methode verfügbar ist
Wovon reden sie?
Bedeutet dies, dass, wenn kein Setter verfügbar ist (ivar, aber keine Eigenschaft), es sich um AGAIN RETAINED (anders als das "retain", das sie gerade in der vorherigen Klausel erwähnen) --- oder wiederholen sie sich nur, d.h. das "retains the object by default" ist das gleiche "retain", von dem sie unmittelbar zuvor sprachen ("created with a retain count of 1 and then autoreleased").
Und warum sollten sie die automatische Freigabe überhaupt erwähnen, wenn das nicht der Fall ist?
In der Tat - falls jemand die Antwort auf diese Frage konkret kennt ...... Woher weißt du das?!? Haben Sie DTS gefragt, oder durch Tests, oder? Ich schlage vor, die Schlüsseldokumentation (gerade eingefügt) ist äußerst unklar.
Auch hier gilt: Wenn Sie ein IBOutlet, aber nicht eine Eigenschaft , verbunden mit einem "Top-Level" Objekt .. sind Sie für die Freigabe verantwortlich? Wird es einbehalten? in dieser Situation?
Im Übrigen .... nur in Situation (1) ist es absolut der Fall, dass das Ding freigegeben wird, wenn BigView verschwindet? Ich würde davon ausgehen, dass dies der Fall ist, aber wer weiß?
Die Frage ist, was passiert, wenn Sie ein IBOutlet iVar verwenden, aber NICHT eine Eigenschaft...
Ich habe dummerweise noch nie darüber nachgedacht / zu viel vermutet, hat jemand die entscheidende Antwort? Prost!!
Für das Protokoll habe ich ein Testprojekt erstellt.
In der Tat (für mich überraschend) der bloße Akt des Verbindens eines IB-Elements mit einem IBOutlet fügt in der Tat anscheinend ein weiteres Element hinzu .
(Ich kann nur vermuten, aus der schlampigen Doku, in dieser Situation bekommen Sie speziell: Retain, Autorelease, Retain - was unterm Strich zu einem Retain führt).
So, das ist die Antwort.
Ich werde das Demoprojekt veröffentlichen. Ich verweise auch alle Leser auf Jonahs Antwort unten, die das Verhalten von setValue:forKey einwandfrei erklärt: Vielen Dank
0 Stimmen
Vielen Dank. Ich habe mir GENAU die gleichen Fragen gestellt! Ich war so verwirrt, nachdem ich die Apple-Dokumente gelesen hatte, dass ich völlig unsicher war, woran ich glauben sollte. Und auch Dank an Jonah für diese Klärung.
0 Stimmen
Das ist schon seltsam, da stimme ich Ihnen zu. Danke für das Up-Vote, denn das hat mir die "Super-Wesen-Macht" oder so auf dieser Seite gegeben!!! Ich bin der König der Welt!!!