10

Meine Frage ist, warum schwache IBOutletCollection immer Null ist? Wenn der Wechsel schwach bis stark ist, sind alle meine Knöpfe da, es ist wirklich komisch. Ich versuche, die Logik von Apple zu verstehen, und ich kann keinen Unterschied zwischen einer einzelnen Taste und einer Reihe von Tasten in Bezug auf die Speicherverwaltung erkennen. Fehle ich etwas?schwach IBOutleCollection ist immer Null

+0

Danke für die Formulierung Ihrer Frage als ein Problem mit "schwach". Löste mein Problem sofort! – phatmann

Antwort

9

In keiner Weise vollständig, aber einfache Antwort:

Ein einzelner UIButton mit IB erstellt automatisch ein Subview von einem anderen UIView ist (zumindest die .view Ihrer UIViewController) und wies stark an deswegen.

Ein IBOutletCollection ist ein NSArray oder NSMutableArray, kein UIView überall angezeigt und UIViews haben offensichtlich keine Eigenschaft zeigt auf Outlet (Collection) s, diesen Punkt zu ihnen, so ist nichts zu IBOutletcollections zeigt. Das musst du selbst machen.

7

Von Apple Resource Programming Guide:

Jedes Mal, wenn Sie die NSBundle oder NSNib Klasse bitten, eine Feder-Datei zu laden, erstellt der zugrunde liegende Code eine neue Kopie der Objekte in dieser Datei und gibt sie dir. (Der Code zum Laden von Nibs lädt keine Nib-Dateiobjekte aus einem vorherigen Ladeversuch.) Sie müssen sicherstellen, dass Sie das neue Objektdiagramm so lange wie nötig beibehalten und es ablehnen, wenn Sie damit fertig sind. In der Regel benötigen Sie starke Referenzen auf Objekte der obersten Ebene, um sicherzustellen, dass sie nicht freigegeben werden. Sie benötigen keine starken Verweise auf Objekte, die sich im Diagramm unten befinden, da sie den Eltern gehören, und Sie sollten das Risiko der Erstellung starker Referenzzyklen minimieren.

Aus einer praktischen Perspektive, in iOS und OS X-Outlets sollten als deklarierte Eigenschaften definiert werden. Outlets sollten im Allgemeinen schwach sein, mit Ausnahme von denen, die vom Eigentümer der Datei stammen, zu Objekten der obersten Ebene in einer Nib-Datei (oder in iOS, einer Storyboard-Szene), die stark sein sollte. Outlets, die Sie erstellen, sollten daher in der Regel schwach sein, denn:

Outlets, die Sie beispielsweise in Teilansichten einer View-Controller-Ansicht oder eines Fenster-Controller-Fensters erstellen, sind beliebige Referenzen zwischen Objekten, die keine Eigentumsrechte implizieren. Die starken Steckdosen werden häufig durch Framework-Klassen angegeben (z. B. UViewViewController-View-Outlet oder NSWindowControllers Fenster-Outlet).

@property (weak) IBOutlet MyView *viewContainerSubview; 
@property (strong) IBOutlet MyOtherClass *topLevelObject; 

Und weiter unten auf der Seite:

Outlets zu stark verändert werden sollen, wenn der Ausgang in Betracht gezogen werden sollte, das referenzierte Objekt zu besitzen:

  • Wie bereits erwähnt, diese ist oft der Fall mit dem Eigentümer der Datei - Objekte auf oberster Ebene in einer Nib-Datei werden häufig als Besitzer des Dateibesitzers betrachtet.
  • Sie können in einigen Situationen ein Objekt aus einer NIB-Datei außerhalb des ursprünglichen Containers benötigen. Sie verfügen beispielsweise über eine Quelle für eine Sicht, die vorübergehend aus der ursprünglichen Sichthierarchie entfernt werden kann und daher unabhängig voneinander verwaltet werden muss.