2016-12-06 83 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

相关问题