2011-05-26 29 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