iOS Core Data - 意外的内存泄漏

Posted

技术标签:

【中文标题】iOS Core Data - 意外的内存泄漏【英文标题】:iOS Core Data - unexpected memory leak 【发布时间】:2011-05-26 13:55:43 【问题描述】:

我有多线程核心数据设置 - 它运行良好。在这个设置中,我有一系列获取所需数据等的函数。除了这个导致小泄漏之外,它们都运行良好 - 但它加起来非常快并导致应用程序崩溃。

- (id)getRecordOfType:(NSString *)type WithCode:(NSString *)codeString
    id returnObj = nil;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:type inManagedObjectContext:self.managedObjectContext]];

    NSPredicate *categoryPred = [NSPredicate predicateWithFormat:[@"code='" stringByAppendingFormat:@"%@'", codeString]];
    [request setPredicate:categoryPred];
    categoryPred = nil;

    if (![request entity]) 
        [request release]; request = nil;
        return nil;
    

    NSError *error;
    NSMutableArray *results = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

    for (id tmpObj in results) 
        if([(NSString *)[tmpObj code] isEqualToString:codeString])
            returnObj = tmpObj;
            break;
    

    [results release];
    [request release];

return returnObj;

如果有人能在此提供一些启发,将不胜感激。

提前致谢,

迈克尔

【问题讨论】:

【参考方案1】:

我无法轻易发现内存泄漏。另一方面,我认为内存泄漏不是很容易导致崩溃的原因,只有在内存不足的情况下才会发生。无论如何,在我看来,您的代码存在可能导致崩溃的问题:

来自结果,

    NSMutableArray *results = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

你选择一个对象:

           returnObj = tmpObj;

并在发布结果后返回:

[results release];
...
return returnObj;

我的理解是释放一个数组也会释放它的所有对象,所以你返回的对象可以在任何时候被释放(甚至只是被释放)。

【讨论】:

感谢您的反馈-我发现了泄漏-我错误地读取了仪器并查看了错误的功能:P 嘿。迈克尔,出于好奇:您对release 的看法是什么?你是在返回时立即retain-ing 你的returnObj 还是我错了? 我没有保留 returnObj - 它被以下函数使用: ^^above 出于某种原因提前删掉了我^^ -> 我没有保留返回的对象 - 我只是使用它来获取用户对象的详细信息以检查输入的用户名/密码。

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

Java 应用程序中 io.vertx.core.impl.EventLoopContext 中的内存泄漏

内存泄漏

为啥 Rust 认为泄漏内存是安全的?

JS中4种常见的内存泄漏

前端如何处理内存泄漏

如何使用模块化代码片段中的LeakCanary检测内存泄漏?