id __weak obj1 = obj0;
等于
id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;
在iOS和OSX的 Pro多线程和内存管理。
但为什么obj1
需要添加到自动释放池,我认为制作一个对象的弱指针不应该影响它的生命周期。
答案 0 :(得分:5)
train_df
以上代码转换为:
{
NSObject* sp = [NSObject new];
NSObject* __weak wp = sp;
}
1)id sp = objc_msgSend(NSObject, "new");
id wp;
objc_initWeak(&wp, sp);
objc_destroyWeak(&wp);
objc_storeStrong(&sp, 0);
只是将弱指针obj_initWeak
与强指针wp
相关联,以确保当sp
指向的对象被解除分配sp
时自动重置为nil,这不会增加指向对象的保留计数
2)wp
破坏弱指针和强指针的关联
3)obj_destroyWeak
在最后一个语句中等于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
Apple LLVM version 8.0.0 (clang-800.0.42.1)
的新版本不会将版本推迟到autoreleasepool
,而是直接使用objc_release
。