2010-07-14 55 views
2

我非常需要幫助,在我的iPhone應用程序中發生內存泄漏。該應用程序已準備好提交到應用程序商店,是穩定的,在iPhone模擬器或叮噹中根本沒有任何內存泄漏......但似乎與我的iPod Touch上的它們充滿了矛盾。核心數據內存泄漏 - iPhone iOS4

當我嘗試從Core Data中檢索數據時,它們都來自managedObjectModel。

我的應用程序中的核心數據代碼是由Xcode自動創建的,我注意到代碼已經改變,當你得到xcode來生成它...我嘗試過新舊但是沒什麼區別。

如果我註釋掉下面的代碼,問題就會消失......無論如何可以看到它有什麼問題嗎?到目前爲止,我已經花了9個小時,只是想不出來!

NSString *entityForName = [[NSString alloc] initWithString:@"OfflineSettings"]; 

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

[entityForName release]; 

NSSortDescriptor *sortById = [[NSSortDescriptor alloc] initWithKey:@"Id" ascending:YES]; 
[request setSortDescriptors:[NSArray arrayWithObject:sortById]]; 
[sortById release]; 

NSError *error; 
NSMutableArray *mutableFetchResults = [[[self managedObjectContext] executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    // Handle the error. 
    NSLog(@"Error fetching"); 
} 

int intId = -1; 

if ([mutableFetchResults count] == 0) { 
    TTDERROR(@"No id has been saved to offline settings");  
} else {  
    OfflineSettings *offlineSettings = (OfflineSettings *)[mutableFetchResults objectAtIndex:0];   
    intId = [offlineSettings.Id intValue]; 
} 

[mutableFetchResults release]; 
[request release]; 

泄漏具體似乎是在這條線:

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

..和[自managedObjectContext]的代碼是如在情況下,它可以幫助如下..

- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext_ != nil) { 
     return managedObjectContext_; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext_ = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext_; 
} 

我真的很茫然,所以我會很感激一些幫助!

Steven

+0

我不明白這條線是如何特別引起泄漏的,但你爲什麼做一個可變的副本?您根本不需要修改數組,只需訪問它,然後釋放它。另外,你如何檢測iPod上的泄漏,但不是在模擬器中? – bobDevil 2010-07-14 16:59:19

+0

嘿, mutableCopy在我最初從它複製的示例代碼中。我已經嘗試過,並且擺脫了隨附的版本,但它沒有幫助。 我使用儀器檢測iPod上的泄漏。 謝謝, – 2010-07-14 17:13:13

回答

1

您不需要可變副本。 executeFetchRequest:返回一個autoreleased靜態數組,你不會改變數組。 (我一直在看這個,必須在某個地方舉個例子。)同樣,創建NSString也是毫無意義的。只需將字符串文字放在entityForName:中即可消除另一個可能的錯誤來源。

以上這些都可能是泄漏的原因,但你應該刪除它們。作爲一個經驗法則,如果你在設備上有麻煩,但不是在模擬器上,或者在一個硬件上而不是在其他硬件上,那麼問題出在一個庫/框架中,因爲發生錯誤的硬件沒有正確編譯。真的沒有任何類型的編碼器錯誤在一個環境中泄漏,而不是其他類型。當我們犯了一個錯誤,這是普遍的。

由於不同的設備使用不同的圖形和音頻硬件,圖像和聲音等資源的行爲也會有所不同。然而,這很少見。

如果你通過Instruments運行代碼,它應該告訴你到底是哪個對象在泄漏。

+0

我一直在看'mutableCopy'的東西。希望我們中的一個能夠追蹤它的來源,因爲它跟我一直看到的那個演員一樣愚蠢。 – 2010-07-14 19:16:50

+0

好的,謝謝TechZen ...這就是我喜歡的那種建議,明確的!即「實際上沒有任何類型的編碼器錯誤在一個環境中泄漏,而不是在其他環境中泄漏。當我們犯了一個錯誤,它是通用的「 所以在那個邏輯上,因爲我的代碼在模擬器中沒有內存泄漏的情況下工作,所以我沒有犯一個編碼錯誤 你可以擴展所有的正確或錯誤如何編譯iPhone/iPod設備的框架?...和/或如何檢測項目中使用的框架/庫之一何時被錯誤地編譯? 在miunute中,我的項目使用了很少的框架/庫 再次感謝 – 2010-07-14 22:54:49

+0

哦,我一直在通過儀器運行代碼,這就是我如何知道我有一個泄漏... 泄漏的對象:GeneralBlock4096 負責任的圖書館:基金會 負責任的框架:NSPushAutoreleasePool ..如果我考慮擴展的細節,它會導致下來: [AppDelegate中managedObjectContext] [AppDelegate中persistentStoreCoordinator] [AppDelegate中managedObjectModel] – 2010-07-14 23:05:04