我有疑问weak
ARC 中的属性(自动引用计数)
我的理解(如有错误请指正):
weak
属性的行为类似于assign
属性,但当该属性指向的实例被销毁时,ivar 会指向 nil。
问题:
- 我只是觉得吸气剂
weak
属性保留和自动释放。它不是应该像 getter 一样表现吗?assign
getter 不保留和自动释放的属性?(请参考程序)
Program:
我在下面给出了程序的实际输出和我的预期输出。
Note - 当我更改财产时weak
to assign
我的预期输出得到满足
#import<Foundation/Foundation.h>
@interface A : NSObject
- (void) dealloc;
@end
@implementation A
- (void) dealloc
{
printf("\tinstance of A deallocated = %p\n", self);
}
@end
@interface B : NSObject
@property (weak) A* xa1;
- (void) dealloc;
@end
@implementation B
@synthesize xa1;
- (void) dealloc
{
printf("\tinstance of B deallocated = %p\n", self);
}
@end
int main()
{
B* b1 = [[B alloc] init];
@autoreleasepool //autoreleasepool 1
{
{ //block 1
A* a1 = [[A alloc] init];
printf("\ta1 = %p\n", a1);
b1.xa1 = a1;
A* a3 = b1.xa1;
printf("--- end of block 1\n");
} //at this point i expected instance pointed by a1 to be destroyed
printf("--- end of autoreleasepool 1\n");
}
printf("---- end of main\n");
return(0);
}
实际输出:
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
Thanks
供应weak
在财产上假设__weak
ivar 的所有权,即它只是一个指令@synthesize
.
根据http://clang.llvm.org/docs/AutomaticReferenceCounting.html http://clang.llvm.org/docs/AutomaticReferenceCounting.html§4.2,阅读__weak
变量需要保留对象(当然,然后释放):
对对象左值执行左值到右值转换时会发生读取。
- 对于 __weak 对象,当前指针被保留,然后在当前完整表达式末尾释放。对于分配和指向对象的最终释放,这必须以原子方式执行。
- 对于所有其他对象,左值加载有原始语义。
它没有说明原因,但想一想如果从 __weak 变量获得的对象在您开始使用它之前就死掉了,会发生什么。弱指针的目的是确保你有nil
或具有众所周知生命周期的有效对象,这就是为什么读取其值意味着保留指针对象(然后属性的 getter 返回它自动释放)。
这并不是 Obj-C 独有的,它是所有弱指针实现(引用计数和垃圾收集)的常见习惯用法。弱指针不能直接给出指针值,它们必须创建指向“持有”对象的强指针,以确保它在调用者开始使用它之前不会消失。在Obj-C中,是retain-autorelease;在C++中,weak_ptr首先创建shared_ptr,在垃圾收集环境中,返回强引用并默默地延长对象的生命周期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)