您永远不应该关心绝对保留计数。只是你是“平衡的”,这意味着对于每一个alloc
, new*
, copy
,mutableCopy
并且retain
你需要一个相应的release
or autorelease
(当不使用 ARC 时)。
如果您将此规则应用于每一行,您可以看到您的第二行有一个alloc
,但没有释放。事实上,在这里分配一个实例是绝对没用的,因为你反正对它不感兴趣。所以它应该简单地阅读:
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [firstArray mutableCopy];
// There is no third line.
但是让我们讨论一下您的原始代码,看看发生了什么:
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
// secondArray points to a new instance of type NSMutableArray
secondArray = [firstArray mutableCopy];
// You have copied another array (created a new NSMutableArray
// instance) and have overwritten the pointer to the old array.
// This means that the instance allocated in line 2 is still there
// (was not released) but you don't have a pointer to it any more.
// The array from line 2 has been leaked.
在 Objective-C 中,我们经常谈到所有权:很少有方法可以让您成为对象的“所有者”。这些都是:
alloc
new*
,如newFoo
copy
和mutableCopy
retain
如果你调用这些,你会得到一个你负责的对象。这意味着您需要调用相应数量的release
和/或autorelease
这些对象。例如,如果你这样做就好了[[obj retain] retain];
,然后[[obj autorelease] release];