为什么会泄漏?
arrayOfPerformances
是合成的NSMutableArray
,(nonatomic, retain)
属性。
currentPerformanceObject
是合成的Performance *
,(nonatomic, retain)
属性。
Performance
是自定义类
if(self.arrayOfPerformances == nil)
{
self.arrayOfPerformances = [[NSMutableArray alloc]init];
}
[self.arrayOfPerformances addObject:currentPerformanceObject];
[currentPerformanceObject release];
currentPerformanceObject = nil;
答案 0 :(得分:11)
您正在创建一个新数组和同时在此行中保留它,因为您使用点表示法调用(retain)
属性设置器:
// Your property
@property (nonatomic, retain) NSMutableArray *arrayOfPerformances;
// The offending code
self.arrayOfPerformances = [[NSMutableArray alloc]init];
因此,本地创建的数组正在泄漏,因为您没有释放它。您应该自动释放该数组,或者创建一个临时的本地var,赋值,然后释放本地var,如下所示:
// Either this
self.arrayOfPerformances = [[[NSMutableArray alloc] init] autorelease];
// Or this (props Nick Forge, does the same as above)
self.arrayOfPerformances = [NSMutableArray array];
// Or this
NSMutableArray *newArray = [[NSMutableArray alloc] init];
self.arrayOfPerformances = newArray;
[newArray release];
答案 1 :(得分:4)
如果你的.arrayOfPerformances
属性从未被释放(它通常会在-dealloc
中释放),那么除了数组本身之外,当释放该对象时,数组中的任何对象都将被泄露。
您需要在-dealloc
中发布这两个属性:
- (void)dealloc
{
... other deallocs
self.arrayOfPerformances = nil;
self.currentPerformanceObject = nil;
[super dealloc];
}
另外,正如@BoltClock指出的那样,您需要释放或自动释放NSMutableArray
。最好的方法是使用自动释放的方法初始化它:
self.arrayOfPerformances = [NSMutableArray array];
此外,您无需发布currentPerformanceObject
,只需将该属性设置为nil即可,因为将retain
ed属性设置为nil
会为您释放该属性。您的代码应该看起来像这样:
if (self.arrayOfPerformances == nil) {
self.arrayOfPerformances = [NSMutableArray array];
}
[self.arrayOfPerformances addObject:self.currentPerformanceObject];
self.currentPerformanceObject = nil;
答案 2 :(得分:1)
这条线是罪魁祸首:
self.arrayOfPerformances = [[NSMutableArray alloc]init];
alloc / init之后的保留计数为1。通过arrayOfPerformances
属性setter设置值会再次增加保留计数(因为它是一个retain属性)。