NSMutableArray 内存泄漏问题

Posted

技术标签:

【中文标题】NSMutableArray 内存泄漏问题【英文标题】:NSMutableArray memory leaks problems 【发布时间】:2011-03-31 09:04:30 【问题描述】:

我正在开发简单的 iPhone 游戏。当游戏结束时,我试图将一些分数信息保存到 .plist 文件中。你能帮我理解我做错了什么吗?

这是“完成”游戏的方法:

- (void) gameDone 

    // something ....

// save our current score values
NSDictionary *currentScore = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:[score getScoreValue]], @"score", [NSNumber numberWithFloat:[time getSeconds]], @"time", nil];
[score saveValueToFile:currentScore toFile:fileName];
[currentScore release];

// something ....

这里有两种方法可以保存我其他班级的分数:

- (NSMutableArray *) loadFromFile:(NSString *) fileName 

    // get a paths
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", fileName]];

    NSMutableArray *scoreTable = [NSMutableArray arrayWithContentsOfFile:plistPath];

    return scoreTable;



// save a score table to plist file
- (void) saveValueToFile:(NSDictionary *)value toFile:(NSString *)fileName 

    // load all score table
    NSMutableArray *scoreTable;
    scoreTable = [self loadFromFile:fileName];

    // insert new value
        // [MEMORY_LEAKS_LINE] ATTENTION: Instrument > Memory Leaks point to this line  
    [scoreTable insertObject:value atIndex:[scoreTable count]];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", fileName]];

    [scoreTable writeToFile:path atomically:YES];   
    [scoreTable release];   

当我启动一个新游戏时(实际上我的游戏设计为可以一个接一个地玩多个游戏)Memory Leaks Instrument 总是在 Total Leaks Bytes 中添加 32 个字节并链接到 [MEMORY_LEAKS_LINE]

我认为我的问题可能与 currentScore 值有关。但我在这里的示例代码的第一部分发布它。

我做错了什么?

【问题讨论】:

你试过“产品->分析” 【参考方案1】:

我不确定是否泄漏,但您正在执行 'scoreTable release' ,但您的 scoreTable 已经处于自动释放模式(您调用了 [NSMutableArray arrayWithContentsOfFile:plistPath]),所以它没有保留

【讨论】:

好吧,也许我的措辞不正确 - 但我的想法是 - 这里有一个双重发布,这是一个禁忌。 无论如何双释放都不会分配内存。为什么我的内存泄漏总数增加了 32 个字节? 在追查泄漏之前,您需要修复所有已知的错误。这段代码甚至不会编译。确保在构建和使用静态分析器时出现零警告。

以上是关于NSMutableArray 内存泄漏问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSMutableArray 时内存泄漏

iPhone SDK 中的 NSMutableArray、NSArray、NSString 内存泄漏

iPhone 应用程序内存泄漏与 NSMutableArray 中的 UIImages

如何在不造成内存泄漏的情况下清除自定义对象的 NSMutableArray?

浅谈内存开辟问题和Block内存问题

如何解决 SKDatabase 函数中的内存泄漏?