3

通常、weak参照は、アプリケーション オブジェクト グラフでの保持サイクルを回避するために使用されます。私はその部分を理解しています。ここで、さらに一歩進んで、それらが内部でどのように機能するかを理解したいと思います。

少し検索すると、__weak修飾子を使用しているときに、その修飾子に関連付けられた変数が自動解放プールに登録されると読みましたが、これはどういう意味ですか? オブジェクトがプールに登録されているのはなぜですか? どのようなタイプのプールが使用されていますか? それはメインプールですか、それとも特別に作成された他のプールですか?

このコードを使用すると:

id _weak myWeakObj = [[NSObject alloc] init];

コンパイラは、次の方法で修正できる警告を表示します。

id _strong myStrongObj =  [[NSObject alloc] init];
id _weak myWeakObj = myStrongObj;

では、前の質問に基づいて、 によって参照されるオブジェクトはどうなりますmyStrongObjか? 可能であれば、コンパイラのコードがどのようなものか知りたいですか?

4

1 に答える 1

5

以下はあなたの友人です。

また、Objective-C ランタイムのソース:

特に、以下をご覧ください。

あなたが見て、最初のリンクが話しているようにすると、それが「ボンネットの下」でどのように機能するかがわかりますobjc_initWeak。弱参照の登録と弱参照の登録解除にobjc_destroyWeakは根性があります。weak_register_no_lockweak_unregister_no_lock

それが実際にどのように機能するかについてのすべての複雑さを調べて見るのはあなたに任せます:-)。

于 2012-05-22T23:31:50.647 に答える