目标C - 这两个陈述之间的区别?

时间:2012-12-06 05:43:52

标签: objective-c

有人可以解释以下(使用ARC)之间的区别,其中myObj定义为

@property(nonatomic, weak) MyType *myObj;

通过局部变量分配:

MyType *_myObj = [MyType new];
self.myObj = _myObj;

self.myObj = [MyType new];

在前一种情况下,对象实例myObj似乎持久存在,而在后一种情况下,实例在封闭功能完成后很快被释放。有什么不同?它们不应该是一样的吗?

[编辑]我明白我已经指定了弱者,我的问题仍然存在。我不知道为什么这会被低估。

2 个答案:

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