gpt4 book ai didi

ios - 为什么 __weak 对象会被添加到自动释放池中?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:18:45 27 4
gpt4 key购买 nike

id __weak obj1 = obj0;

等于

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

适用于 iOS 和 OSX 的 Pro 多线程和内存管理

但是为什么obj1需要添加到autorelease pool中,我认为做一个对象的弱指针应该不会影响它的生命周期。

最佳答案

{
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指向的对象 被释放 wp 会自动重置为 nil,这不会增加指向对象的保留计数。
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 直接。

关于ios - 为什么 __weak 对象会被添加到自动释放池中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40993809/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com