检查属性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 方法中也释放