id __weak obj1 = obj0;
等於爲什麼__weak對象會被添加到autorelease池中?
id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;
在Pro的多線程和內存管理iOS和OSX。
但爲什麼obj1
需要添加到autorelease池中,我認爲使對象的弱指針不應該影響它的生命週期。
id __weak obj1 = obj0;
等於爲什麼__weak對象會被添加到autorelease池中?
id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;
在Pro的多線程和內存管理iOS和OSX。
但爲什麼obj1
需要添加到autorelease池中,我認爲使對象的弱指針不應該影響它的生命週期。
{
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
僅僅是弱指針wp
與強指針sp
關聯,以確保當由sp
指向的對象被dealloced wp
將自動復位零,這不會影響尖銳物體的保留數量。
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
確保在使用弱指針時,其狀態是一致的。 Apple LLVM version 8.0.0 (clang-800.0.42.1)
的__weak
的新實施不會將發佈延遲到autoreleasepool
,而是直接使用objc_release
。