你绝不应该关心绝对保留数。只有你是“平衡的”,这意味着每alloc
,new*
,copy
,mutableCopy
和retain
你需要一个相应的release
或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];
我想补充说,你有两个对象是拥有的,需要在某个阶段发布。你是对的 - 'retainCount'是unimporant - 只担心平衡拥有呼叫与释放呼叫。 – Abizern
其实secondArray已被分配和使用在代码中的很远的地方。为了方便,我在第二行写了它。所以,如果我为了避免内存泄漏而正确解决了问题,我应该先释放secondArray,这将是绝对有效的? –
@AndreyChernukha:完成后只能释放由'secondArray'指向的对象。释放意味着:*从这一行开始,我不再需要这个对象;它可能会被释放。*'autorelease'意味着:*很快,我不再需要它了;但至少在我离开这个方法之前它应该保持活跃状态。*(这不是100%正确,但足够接近事实是有用的) – DarkDust