使用retain和autorelease分配给另一个对象

时间:2012-08-08 16:10:54

标签: objective-c memory-management retain autorelease

我有以下代码,期望一旦obj2被释放,obj1仍然保留,它会起作用吗?

obj1 = [[Class1 alloc] init];
obj2 = [[obj1 retain] autorelease];

2 个答案:

答案 0 :(得分:4)

  

我有以下代码,期望一旦obj2被释放,obj1仍然保留,它会起作用吗?

obj1obj2都是指向同一对象的指针。创建它时,该对象的保留计数为1。当您在第二行再次保留时,对象的保留计数增加到2。因此,对象(以及它的任何指针)将保持有效,直到它被释放两次。其中一个版本最终将来自第二行的autorelease;另一个应该由您的代码提供。

答案 1 :(得分:2)

它会起作用,但我不确定你的结论是否正确(有解析错误)。

obj1 = [[Class1 alloc] init];
obj2 = [[obj1 retain] autorelease];

根据delta和per-reference来考虑保留和释放是有帮助的。因此,在下面的代码中,您会说“obj1引用的保留计数为+1”,“obj2引用的保留计数为+0”。

也就是说,obj1是强引用,obj2是弱引用。

如果你想让对象消失,你会[obj1 release]。您可以 [obj2 release],但这意味着所有权转让应该只是出于充分的理由而且非常明确。

或者你可以打开ARC并完成它。