检查属性cardCellArray是retain还是copy。如果是这样,当您调用时self.cardCellArray,您设置为属性的对象cardCellArray获取保留计数增加1。
alloc使用&创建对象init(例如initWithCapacity:)返回一个保留计数为 1 的对象,因为您在alloc这里调用了一个方法。
在没有调用的情况下创建对象时,alloc例如[NSMutableArray arrayWithCapacity:]将返回一个autorelease对象(它会在需要时自动将其保留计数减少 1),您可以认为它的保留计数为 0。
在方法中dealloc,您应该调用[self.cardCellArray release],这将自动删除数组保留的所有对象。
您的代码在此处生成一个 retain-count-1 对象
[[NSMutableArray alloc] initWithCapacity:kTotalNumberOfCards]
当您调用时,此对象的保留计数变为 2
self.cardCellArray = xxx
但是在 dealloc 中,您没有减少 cardCellArray 的保留计数,然后发生了泄漏。
所以将您的代码更改为
self.cardCellArray = [[[NSMutableArray alloc] initWithCapacity:kTotalNumberOfCards] autorelease];
autorelease 将在需要时自动减少保留计数。
或者self.cardCellArray = [NSMutableArray arrayWithCapacity:kTotalNumberOfCards];
或者
NSMutableArray *_array = [[NSMutableArray alloc] initWithCapacity:kTotalNumberOfCards];
self.cardCellArray = _array;
[_array release];
或者
cardCellArray = [[NSMutableArray alloc] initWithCapacity:kTotalNumberOfCards];
//this helps because it doesn't call `[self setCardCellArray]` which generate +1 retain count.
cardCellArray最后,记得在 dealloc 方法中也释放