2016-12-06 79 views

回答

4
{ 
    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會遞增引用計數,以確保tmpNSLog聲明活着。 objc_release將對象重置爲原始狀態。

總之,本設計的__weak確保在使用弱指針時,其狀態是一致的。 Apple LLVM version 8.0.0 (clang-800.0.42.1)__weak的新實施不會將發佈延遲到autoreleasepool,而是直接使用objc_release

相關問題