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
。