IBOutlet
sollte aus Leistungsgründen stark sein. Siehe Storyboard-Referenz, Strong IBOutlet, Szene-Dock in iOS 9
Wie in diesem Absatz erläutert, können die Outlets für Unteransichten der Ansicht des Ansichtscontrollers schwach sein, da diese Unteransichten bereits vom Top-Level-Objekt der Nib-Datei besessen werden. Wenn jedoch ein Outlet als schwacher Zeiger definiert ist und der Zeiger gesetzt wird, ruft ARC die Laufzeitfunktion auf:
id objc_storeWeak(id *object, id value);
Dies fügt den Zeiger (Objekt) zu einer Tabelle hinzu, wobei der Objektwert als Schlüssel verwendet wird. Diese Tabelle wird als schwache Tabelle bezeichnet. ARC verwendet diese Tabelle, um alle schwachen Zeiger Ihrer Anwendung zu speichern. Wenn der Objektwert Deallokiert wird, wird ARC über die schwache Tabelle iterieren und die schwache Referenz auf nil setzen. Alternativ kann ARC aufrufen:
void objc_destroyWeak(id * object)
Dann wird das Objekt nicht registriert und objc_destroyWeak ruft erneut auf:
objc_storeWeak(id *object, nil)
Diese Buchführung, die mit einer schwachen Referenz verbunden ist, kann 2-3 mal länger dauern als die Freigabe einer starken Referenz. Daher führt eine schwache Referenz zu einem Overhead für die Laufzeit, den Sie einfach vermeiden können, indem Sie Outlets als stark definieren.
Ab Xcode 7 wird strong
vorgeschlagen
Wenn Sie sich die WWDC 2015 Session 407 Implementieren von Benutzeroberflächendesigns in Interface Builder ansehen, wird (Transkript von http://asciiwwdc.com/2015/sessions/407) vorgeschlagen
Und die letzte Option, die ich erwähnen möchte, ist der Speichertyp, der entweder stark oder schwach sein kann.
Im Allgemeinen sollten Sie Ihr Outlet stark machen, insbesondere wenn Sie ein Outlet mit einer Unteransicht oder einer Einschränkung verbinden, die nicht immer von der Ansichtshierarchie aufrechterhalten wird.
Die einzige Situation, in der Sie wirklich ein Outlet schwach machen müssen, ist, wenn Sie eine benutzerdefinierte Ansicht haben, die auf etwas in der Ansichtshierarchie zurückverweist, und im Allgemeinen wird dies nicht empfohlen.
Also ich werde stark wählen und ich werde auf Verbinden klicken, was mein Outlet generieren wird.
11 Stimmen
Als Hinweis,
IBOutletCollection()
darf nichtweak
sein, ansonsten wird es alsnil
zurückgegeben.0 Stimmen
Xcode 8.2.1 verwendet weak, wenn IBOutlets über den Interface Builder erstellt werden. Viele Antworten hier auf SO raten jedoch, strong zu verwenden.
1 Stimmen
@neoneye Ich habe es gerade mit xcode 8.3.2 ausprobiert, indem ich vom Storyboard zur Swift-Datei gezogen habe, und es wird standardmäßig auf
strong
festgelegt.