有人可以解释以下(使用ARC)之间的区别,其中myObj定义为
@property(nonatomic, weak) MyType *myObj;
通过局部变量分配:
MyType *_myObj = [MyType new];
self.myObj = _myObj;
和
self.myObj = [MyType new];
在前一种情况下,对象实例myObj似乎持久存在,而在后一种情况下,实例在封闭功能完成后很快被释放。有什么不同?它们不应该是一样的吗?
[编辑]我明白我已经指定了弱者,我的问题仍然存在。我不知道为什么这会被低估。
答案 0 :(得分:4)
由于您的属性被定义为弱,因此赋值不会增加保留计数。
在代码的第二位,您创建对象并将其分配给weak属性。完成此操作后,将释放并释放已创建的对象,并将弱属性重置为nil。
在代码的第一位,您将创建的对象分配给强大的局部变量。然后,将强局部变量分配给weak属性。只要局部变量在范围内,创建的对象就有一个引用。一旦局部变量超出范围,对象将被释放并释放,并将weak属性设置为nil。
最终结果是一样的。当方法竞争时,属性保留为nil,因为创建的对象没有其他引用。两者之间的唯一区别是这种情况发生的速度有多快。
答案 1 :(得分:0)
我测试了它,结果是相同的
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//NSObject *_myObj = [NSObject new];
//self.myObj = _myObj;
self.myObj = [NSObject new];
}
- (IBAction)click:(id)sender {
NSLog(@"%@",self.myObj);
}
两种情况都会导致输出为:(null)