为什么__weak对象将被添加到自动释放池?

时间:2016-12-06 11:04:45

标签: ios objective-c automatic-ref-counting weak-references

id __weak obj1 = obj0;

等于

id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;

在iOS和OSX的 Pro多线程和内存管理

但为什么obj1需要添加到自动释放池,我认为制作一个对象的弱指针不应该影响它的生命周期。

1 个答案:

答案 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