単語IBOutlet
は実際には何も定義されていません。
#define IBOutlet
Xcode は、Interface Builder で接続できるようにする目的で、コード内でこの単語の存在を使用するだけです。としての変数またはプロパティの宣言IBOutlet
:
IBOutlet UIButton * button;
@property (...) IBOutlet UIButton * button;
したがって、ARC に関する限り、直接的な影響はありません。それは、またはそのようなものに変換されません (ただし、おそらく、変換される可能性があります) __weak
。単語自体は、コンパイラが取得するまでにソースから完全に削除されています。
一方、この変数またはプロパティがアウトレットであるという事実は、メモリ管理についてどのように考える必要があるかについて意味のある影響を与えます。
IBOutlet UIButton * button;
ARCのようなオブジェクト変数宣言の暗黙的なストレージ修飾子は__strong
、あなたが言ったように、変数に割り当てられたオブジェクトはすべて「所有」と見なされます。MRR では、宣言は単なるポインターです。に割り当てても、割り当てられたオブジェクトの参照カウント/所有権には影響しません。プロパティと同じように機能しassign
ます。* したがって、同じ ivar 宣言の意味は、2 つの管理システム間で異なります。
xib 内のオブジェクトには、ビュー階層によって形成される所有者/所有者の関係があります。つまり、親ビューはサブビューを所有しています。xib の最上位ビューは、ファイルの所有者と呼ばれるオブジェクトによって所有されます。このセットアップは、一般的に言えば、最上位ではないxib 内のオブジェクトへのアウトレットはweak
(ARC の下) またはassign
(MRR の下のプロパティの場合) であるべきであることを意味します。彼らは関係を所有していません。これらは基本的に、ビュー リストへの便利なインデックスです。これはAppleの推奨事項です:
...グラフの下部にあるオブジェクトへの強い参照は必要ありません。オブジェクトは親によって所有されているためです。強い参照サイクルを作成するリスクを最小限に抑える必要があります。
[...]一般にweak
、アウトレットは である必要がありますが、ファイルの所有者から nib ファイル (または、iOS ではストーリーボード シーン) の最上位オブジェクトへのアウトレットは である必要がありますstrong
。作成するアウトレットは [sic] したがって、通常はweak
デフォルトで...
私が説明したように、あなたの単純なポインターIBOutlet
は、メモリ管理の目的でweak
、プロパティ**のように機能しました。これは、それらが正しいことをしていたことを意味します。ARC でコンパイルすると、同じ宣言が間違ったものになる可能性があります。
要約すると、 には変換されIBOutlet
ませんが、ポインターの意味が変わります。デフォルトのメモリ管理セマンティクスがMRR での「割り当て」から ARC での「所有」に変更されたため、またs は一般に非所有であるべきであるため、実際にdos の存在は、ポインターがARCで宣言されるべきであることを意味します。†</sup>weak
IBOutlet UIButton * button;
IBOutlet
IBOutlet
__weak
*プロパティと同様weak
-- 唯一の違いは、オブジェクトの割り当てが解除されたときにweak
ポインタが設定されることです。nil
**自動車nil
部品を除く。
†</sup>または、実際にはweak
プロパティである必要があります。