内存泄漏这种简短的方法

时间:2011-09-02 18:58:46

标签: ios memory-leaks

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;
        }
    }

enter image description here

提前致谢!

1 个答案:

答案 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];