私の質問は、なぜ弱い IBOutletCollection が常に nil なのですか? 弱から強に変更すると、すべてのボタンが表示されますが、それは本当に奇妙です。私はアップルのロジックを理解しようとしていますが、メモリ管理に関して、単一のボタンとボタンの配列に違いはありません。何か不足していますか?
2 に答える
決して完全ではありませんが、簡単な答えです。
IBで作成されたシングルUIButton
は、自動的に他のUIView(少なくともあなたの.view UIViewController
)のサブビューであり、そのために強く示されます。
AnIBOutletCollection
はNSArray
またはNSMutableArray
であり、どこにも表示されませんUIView
。UIViewには、明らかにそれらを指すOutlet(Collection)を指すプロパティがないため、IBOutletcollectionsを指すものはありません。あなたはそれを自分でしなければなりません。
Apple のリソース プログラミング ガイドから:
NSBundle または NSNib クラスに nib ファイルをロードするように要求するたびに、基になるコードがそのファイル内のオブジェクトの新しいコピーを作成し、それらを返します。(nib 読み込みコードは、以前の読み込み試行からの nib ファイル オブジェクトをリサイクルしません。) 新しいオブジェクト グラフを必要な限り維持し、それを使い終わったらそれを放棄するようにする必要があります。通常、最上位オブジェクトへの強い参照が必要であり、それらが割り当て解除されないようにする必要があります。オブジェクトは親によって所有されているため、グラフの下位にあるオブジェクトへの強い参照は必要ありません。また、強い参照サイクルを作成するリスクを最小限に抑える必要があります。
実用的な観点から、iOS および OS X では、アウトレットは宣言されたプロパティとして定義する必要があります。ファイルの所有者から nib ファイル (または、iOS ではストーリーボード シーン) 内の最上位オブジェクトへのアウトレットは強力であるべきですが、それを除いて、一般的にアウトレットは弱いはずです。したがって、作成するアウトレットは通常、弱いものにする必要があります。理由は次のとおりです。
たとえば、ビュー コントローラーのビューまたはウィンドウ コントローラーのウィンドウのサブビューに対して作成するアウトレットは、所有権を意味しないオブジェクト間の任意の参照です。強力なアウトレットは、フレームワーク クラスによって頻繁に指定されます (たとえば、UIViewController のビュー アウトレット、または NSWindowController のウィンドウ アウトレット)。
@property (weak) IBOutlet MyView *viewContainerSubview;
@property (strong) IBOutlet MyOtherClass *topLevelObject;
さらにページの下に:
アウトレットが参照されるオブジェクトを所有していると見なされる場合は、アウトレットをストロングに変更する必要があります。
- 前に示したように、これはファイルの所有者の場合によくあります。nib ファイルの最上位オブジェクトは、ファイルの所有者によって所有されていると見なされることがよくあります。
- 状況によっては、nib ファイルのオブジェクトを元のコンテナーの外に存在させる必要がある場合があります。たとえば、初期のビュー階層から一時的に削除できるビューのアウトレットがあり、独立して維持する必要がある場合があります。