ios - 这个简短方法中的内存泄漏

标签 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

提前致谢!

最佳答案

以下代码肯定会泄漏(假设在属性 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];

或者 - 需要使用一个自动释放的对象,一些开发者喜欢尽可能避免这种情况

self.tableContent = [[[NSMutableArray alloc] init] autorelease];

或者 - 使用一个不必要的临时变量来阐明内存管理

NSMutableArray * tempArr = [NSMutableArray alloc];
self.tableContent = tempArr;
[tempArr release];

关于ios - 这个简短方法中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7288064/

相关文章:

ios - 弹跳 UIScrollView - 提示还有更多

ios - dyld_fatal_error 与 Typhoon+Swift+iOS7.x+Plist-bootstrapping

iphone - iOS 第二语言本地化

php - 如何使用 p8 授权 key 文件通过 PHP 连接到 apn

ios - 如何知道 UITableView.visibleCells 的索引路径?

delphi - 为什么我的程序会泄漏虚拟内存?

找不到C程序中的内存泄漏

Java HtmlUnit 内存泄漏

c - 如何检测分配内存块的位置?

java - 对大型应用程序进行分析很困难