6

ARCを始めたばかりです。ARC以前は、たとえば、単にアウトレットを宣言するだけだったIBOutlet UIButton *button;ので、それなどは保持していません。ARC では、weak または strong を指定しないことは、strong を意味します。

では、ARC の下で同じことを行った場合 (つまりIBOutlet UIButton *button;)、これはボタンが強力な参照であることを意味しますか? または、explcility を弱いと定義する必要がありますか?

要するに、IBOutletは意味しますか__weak?

4

3 に答える 3

16

単語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>weakIBOutlet UIButton * button;IBOutletIBOutlet__weak


*プロパティと同様weak-- 唯一の違いは、オブジェクトの割り当てが解除されたときにweakポインタが設定されることです。nil

**自動車nil部品を除く。

†</sup>または、実際にはweakプロパティである必要があります。

于 2012-04-29T20:40:30.257 に答える
4

いいえ、コードのコンパイル時にIBOutletは基本的に削除されます。ただし、これはXCodeのヘルパーであるため、InterfaceBuilderOutletが何であるかを知ることができます。

基本的に、この単語を使用すると、InterfaceBuilderで要素を接続できます。

デフォルトでは、それはまだ強力です(単語がそこにないことを想像してください)。

ただし、何かがインターフェイスビルダーに接続されると、そのインターフェイスはそれへの強い参照を保持するため、弱いに設定することをお勧めします。したがって、特にその要素が意図されていない場合は、二重の強い参照を持つ意味がありません。インターフェイスがアンロードされたときに存続します。

まさにあなたが探しているものであるこの質問を読んでください:

IBOutletsはARCの下で強いか弱いか?

于 2012-04-25T03:12:53.940 に答える
3

IBOutletキーワードは、ObjectをInterfaceBuilderの要素に関連付けるためにのみ使用されます。それは、弱いまたは強い、またはARCまたはメモリ管理とは何の関係もありません。

于 2012-04-25T03:11:55.087 に答える