Das Wort IBOutlet
ist tatsächlich als nichts definiert:
#define IBOutlet
Xcode verwendet einfach das Vorhandensein dieses Wortes in Ihrem Code, um Ihnen das Herstellen von Verbindungen im Interface Builder zu ermöglichen. Eine Deklaration einer Variablen oder einer Eigenschaft als IBOutlet
:
IBOutlet UIButton * button;
@property (...) IBOutlet UIButton * button;
hat daher keine direkte Auswirkung, was ARC betrifft; es übersetzt nicht (obwohl es theoretisch könnte) in __weak
oder ähnliches. Das Wort selbst ist vollständig aus Ihrem Quellcode verschwunden, wenn der Compiler ihn erhält.
Andererseits hat die Tatsache, dass diese Variable oder Eigenschaft ein Outlet ist, einen bedeutsamen Einfluss darauf, wie Sie über das Speichermanagement nachdenken müssen.
Der implizite Speicherqualifizierer für eine Objektvariablendeklaration wie IBOutlet UIButton * button;
unter ARC ist __strong
, wie Sie sagten - jedes Objekt, das der Variablen zugewiesen wird, wird als "besessen" betrachtet. Unter MRR ist die Deklaration lediglich ein Zeiger; eine Zuweisung hat keine Auswirkung auf den Referenzzähler/Besitz des zugeordneten Objekts - sie verhält sich genauso wie eine assign
Eigenschaft.* Daher ändert sich die Bedeutung derselben ivar-Deklaration zwischen den beiden Verwaltungssystemen.
Objekte in einem xib haben Besitzereigentumsbeziehungen, die durch die Ansichtshierarchie gebildet werden; das heißt, Elternansichten besitzen ihre Untergeordneten. Die Top-Level-Ansicht in einem xib gehört dem Objekt, das als Dateibesitzer bekannt ist. Diese Einrichtung bedeutet, dass Ihre Verbindungen zu Objekten in einem xib, die nicht Top-Level sind, (unter ARC) weak
oder (als Eigenschaft unter MRR) assign
sein sollte. Es handelt sich nicht um Besitzverhältnisse; sie sind im Wesentlichen bequeme Indizes in die Ansichtsliste. Dies ist die Empfehlung von Apple:
...Sie müssen keine starken Verweise auf Objekte weiter unten im Diagramm haben, da sie vom Elternobjekt besessen sind, und Sie sollten das Risiko der Schaffung starker Verweiszyklen minimieren.
[...]Verbindungen sollten im Allgemeinen weak
sein, außer für solche vom Dateibesitzer zu Top-Level-Objekten in einer Schnipsel-Datei (oder, in iOS, einer Storyboard-Szene), die strong
sein sollten. Verbindungen, die Sie erstellen, sollten daher standardmäßig weak
sein...
Ihre einfachen Zeiger IBOutlet
s, wie ich erklärt habe, haben - für Speichermanagementzwecke - wie weak
Eigenschaften gehandelt,** was bedeutet, dass sie das Richtige getan haben. Die gleiche Deklaration wird wahrscheinlich zum falschen Ergebnis führen, wenn sie unter ARC kompiliert wird.
Zusammenfassend: IBOutlet
übersetzt nicht zu weak
, ändert jedoch die Bedeutung des Zeigers. Da die Standard-Speicherverwaltungssemantik von IBOutlet UIButton * button;
von "assign" unter MRR zu "besessen" unter ARC wechselt und da IBOutlet
s im Allgemeinen nicht besitzend sein sollten, impliziert das Vorhandensein von IBOutlet
tatsächlich, dass der Zeiger unter ARC als __weak
deklariert werden sollte.†
*Und ähnlich wie bei einer weak
Eigenschaft - der einzige Unterschied besteht darin, dass weak
Zeiger auf nil
gesetzt werden, wenn das Objekt deallokiert wird.
**Außer dem automatischen nil
Teil.
†Oder, wirklich, sollte es eine weak
Eigenschaft sein.