id __weak obj1 = obj0;
は、iOSとOSXためProのマルチスレッドとメモリ管理では__weakオブジェクトが自動解放プールに追加されるのはなぜですか?
id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;
に等しいです。
しかし、なぜobj1
が自動解放プールに追加する必要があるのか、オブジェクトの弱いポインタを作成してその寿命に影響を与えてはいけないと思います。
id __weak obj1 = obj0;
は、iOSとOSXためProのマルチスレッドとメモリ管理では__weakオブジェクトが自動解放プールに追加されるのはなぜですか?
id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;
に等しいです。
しかし、なぜobj1
が自動解放プールに追加する必要があるのか、オブジェクトの弱いポインタを作成してその寿命に影響を与えてはいけないと思います。
{
NSObject* sp = [NSObject new];
NSObject* __weak wp = sp;
}
上記コードが変換される。
id sp = objc_msgSend(NSObject, "new");
id wp;
objc_initWeak(&wp, sp);
objc_destroyWeak(&wp);
objc_storeStrong(&sp, 0);
1)obj_initWeak
は、単に確実にするために強いポインタsp
で弱いポインタwp
を関連付けることsp
が指し示すオブジェクトがdeallocedさwp
だろうオートリセットnilにすると、指し示したオブジェクトの保持カウントを中断しません。
2)obj_destroyWeak
弱ポインタと強ポインタの関連付けを破棄します。
3)最後のステートメントのobj_storeStrong
は[sp release]
に等しくなります。
しかし、ウィークポインタを使用すると、コンパイラはポイントされたオブジェクトの新しい参照を生成します。
{
NSObject* sp = [NSObject new];
NSObject* __weak wp = sp;
NSLog(@"%@", wp);
}
は
id sp = objc_msgSend(NSObject, "new");
id wp;
objc_initWeak(&wp, sp);
id tmp = objc_loadWeakRetained(wp);
NSLog(@"%@", wp);
objc_release(tmp);
objc_destroyWeak(&wp);
objc_storeStrong(&sp, 0);
objc_loadWeakRetained
がtmp
がNSLog
声明の中で生きていることを確認するために参照カウントをインクリメントうになります。 objc_release
オブジェクトを元の状態にリセットします。
結論として、__weak
のこのデザインは、ウィークポインタの使用中に、その状態が一貫していることを保証します。 __weak
の新しいimplmenetationはApple LLVM version 8.0.0 (clang-800.0.42.1)
にリリースをautoreleasepool
に返信せず、objc_release
を直接使用します。