2011-05-26 57 views
0

我有多线程核心数据设置 - 它工作得很好。在这个设置中,我有一系列的功能来抓取所需的数据等等。除了这个导致一个小漏洞的东西之外,它们都工作得很好 - 但它增加得相当快,并且使应用程序崩溃。iOS核心数据 - 意外内存泄漏

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

如果任何人都可以在这里摆脱一些光它将不胜感激。

由于提前,

迈克尔

回答

0

我不能很容易地发现内存泄漏。另一方面,我认为内存泄漏不容易成为崩溃的原因,只有在内存不足的情况下。总之,在我看来,有你的代码可能可能会导致崩溃的问题:

从结果

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

选择对象:

  returnObj = tmpObj; 

和释放结果后返回:

[results release]; 
... 
return returnObj; 

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

+0

感谢您的反馈 - 我发现了泄漏 - 我错误地读了仪器并看到错误的功能:P – 2011-05-26 15:09:07

+0

嘿。迈克尔,出于好奇:你对“释放”事物有什么看法?你回来后立即'保留'returnObj'还是我错了? – sergio 2011-05-26 15:10:51

+0

我不保留returnObj - 它被使用的函数使用: – 2011-05-26 16:53:08