Objective-C-弱性质-getter自动释放(自动参考计数)
我对ARC中的Objective-C-弱性质-getter自动释放(自动参考计数),objective-c,automatic-ref-counting,getter,autorelease,weak-references,Objective C,Automatic Ref Counting,Getter,Autorelease,Weak References,我对ARC中的弱属性(自动参考计数)有疑问 我的理解(如果我错了,请纠正我): a1 = 0x10d713f50 --- end of block 1 --- end of autoreleasepool 1 instance of A deallocated = 0x10d713f50 ---- end of main instance of B deallocated = 0x10d713d30 a1 = 0x10d713f50 --- end of blo
弱属性(自动参考计数)有疑问
我的理解(如果我错了,请纠正我):
a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
instance of A deallocated = 0x10d713f50
---- end of main
instance of B deallocated = 0x10d713d30
a1 = 0x10d713f50
--- end of block 1
instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
instance of B deallocated = 0x10d713d30
weak
属性的行为类似于assign
属性,只是当属性指向的实例被销毁时,ivar会指向nil
问题:
a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
instance of A deallocated = 0x10d713f50
---- end of main
instance of B deallocated = 0x10d713d30
a1 = 0x10d713f50
--- end of block 1
instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
instance of B deallocated = 0x10d713d30
我只是觉得弱属性的getter保留和自动删除。它的行为不应该像assign
属性的getter一样,getter不保留和自动释放吗?(请参考程序)
节目:
a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
instance of A deallocated = 0x10d713f50
---- end of main
instance of B deallocated = 0x10d713d30
a1 = 0x10d713f50
--- end of block 1
instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
instance of B deallocated = 0x10d713d30
我在下面给出了实际输出和预期输出的程序
注意-当我将属性从弱
更改为分配
时,我的预期输出得到满足
我的预期输出:
a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
instance of A deallocated = 0x10d713f50
---- end of main
instance of B deallocated = 0x10d713d30
a1 = 0x10d713f50
--- end of block 1
instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
instance of B deallocated = 0x10d713d30
感谢在属性上提供弱
假设ivar的所有权为\uu弱
,即它只是@synthesis
的指令
根据§4.2,读取\uu弱变量需要保留对象(当然,在以下情况下释放):
在对对象左值执行左值到右值的转换时发生读取
- 对于_弱对象,将保留当前指针对象,然后在当前完整表达式的末尾释放。这必须在指针对象的赋值和最终发布时以原子方式执行
- 对于所有其他对象,左值都加载了基本语义
它没有说明原因,但想想如果你从_弱变量得到的对象在你开始使用它之前就死了会发生什么。弱指针的目的是确保您拥有nil
或具有已知生存期的有效对象,这就是为什么读取其值意味着保留指针对象(然后属性的getter返回autoreleased)
这不是Obj-C所独有的,它是所有弱指针实现(refcounted和垃圾收集)的通用习惯用法。弱指针不能直接给出指针值,它们必须创建指向“hold”对象的强指针,以确保在调用方开始使用它之前它不会死掉。在Obj-C中,它是保留自动释放;在C++中,最先创建的是SydDypTR,在垃圾收集环境中,返回一个强引用,并且对象的生命周期被延长。
function -[B xa1] {
var_8 = rdi;
var_0 = rsi;
rdi = objc_loadWeakRetained(var_8 + *_OBJC_IVAR_$_B.xa1);
rax = [rdi autorelease];
return rax;
}
所以当你得到财产的时候
A* a3 = b1.xa1;
a1==b1.xa1获得自动释放呼叫并由自动释放池保留谢谢回复,我有疑问。如果我错了,请纠正我-使用弱属性的目的是确保寿命不会增加,只要所有者不破坏它,就可以使用它。如果要延长生存期,使用弱指针不是有违目的吗?@user1046037我已经更新了我的答案,其中有一个指向ARC规范的链接,明确记录了这种行为。@user1046037属性上的弱只是@synthesis
的指令。您观察到的行为是由于\uu-weak
读取语义造成的:您不能将weak转换为不安全的\u-unretained
指向某个对象的指针,因为它的生命周期可以随时结束,您必须在使用它之前保留该对象。我觉得[bar dosomethingthatsdestroysfoo]除非包括fooPtr在内的所有所有者都超出范围,否则无法销毁fooPtr指向的实例。@user1046037这可能不是一个好例子。我们可以说,由方法(getter)返回的对象必须至少将其生存期延长到当前作用域的末尾,而对于弱指针,如果不先保留它们,它将不为真。