0

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

@property(nonatomic, weak) MyType *myObj;

通过局部变量赋值:

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

self.myObj = [MyType new];

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

[编辑] 我知道我已经指定了弱,我的问题仍然存在。我不确定为什么这会被否决。

4

2 回答 2

4

由于您的属性被定义为弱,因此分配不会增加保留计数。

在第二段代码中,您创建对象并将其分配给弱属性。完成此操作后,创建的对象将被释放并解除分配,从而将弱属性重置为 nil。

在第一段代码中,您将创建的对象分配给一个强局部变量。然后将强局部变量分配给弱属性。只要局部变量在范围内,创建的对象就有引用。一旦局部变量超出范围,对象将被释放并释放,而将弱属性设置为 nil。

最终结果是一样的。当方法竞争时,该属性保留为 nil,因为创建的对象没有其他对它的引用。两者之间的唯一区别是这种情况发生的速度。

于 2012-12-06T05:59:47.137 回答
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)

于 2012-12-06T05:58:58.487 回答