Instruments正在报告此方法中此VC的所有泄漏。可能是什么原因?我认为这是分配,但不知道为什么泄漏。
- (void)loadViewContent
{
switch (self.currentView)
{
case 0:
self.title = @"Title 1";
[self.navigationItem.backBarButtonItem release]; //para evitar un memory leak
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Blood" style:UIBarButtonItemStylePlain
target:nil action:nil] autorelease];
[tableContent addObject:@"0"];
[tableContent addObject:@"1 - 49"];
[tableContent addObject:@"50 - 75"];
[tableContent addObject:@"76 - 89"];
[tableContent addObject:@"More than 89"];
break;
case 1:
self.title = @"Title 2";
[self.navigationItem.backBarButtonItem release];
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Resp. Rate" style:UIBarButtonItemStylePlain
target:nil action:nil] autorelease];
[tableContent addObject:@"0"];
[tableContent addObject:@"1 - 5"];
[tableContent addObject:@"6 - 9"];
[tableContent addObject:@"More than 29"];
[tableContent addObject:@"10 - 29"];
break;
default:
break;
}
}
提前致谢!
答案 0 :(得分:2)
以下代码肯定会泄漏(假设在属性tableContent上复制或保留的内存模型):
self.tableContent = [[NSMutableArray alloc] init];
tableContent的setter将释放旧值并保留/复制/分配新值。考虑如下声明:
self.tableContent = [NSMutableArray array];
这完全有效,因为[NSMutableArray array]是一个自动释放的对象。 self.tableContent的后续使用仅在此之后有效,因为tableContent的setter会增加保留计数,防止tableContent被释放。
您的代码(看起来很奇怪)应该如下所示:
self.tableContent = [[NSMutableArray alloc] init];
[self.tableContent release];
OR - 需要使用自动释放的对象,有些人可能会尽可能避免使用
self.tableContent = [[[NSMutableArray alloc] init] autorelease];
OR - 使用不必要的临时变量来阐明内存管理
NSMutableArray * tempArr = [NSMutableArray alloc];
self.tableContent = tempArr;
[tempArr release];