2011-01-30 85 views
1

我試圖解決內存泄漏,但我找不到任何解決方案。可變觸摸與mutableCopy內存泄漏

儀器說有這個方法泄漏:

- (void)refreshData { 

Sn0werSp33dAppDelegate *appDelegate = [[Sn0werSp33dAppDelegate alloc] init]; 
NSFetchRequest *coreDataNewsFetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"News" inManagedObjectContext:managedObjectContext]; 

[coreDataNewsFetchRequest setEntity:entity]; 

self.managedObjectContext = appDelegate.managedObjectContext; 
self.newsArray = [[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest error:nil] mutableCopy];//Intruments says that here is the memory leak :(


[appDelegate release]; 
[coreDataNewsFetchRequest release]; 
[entity release]; 
} 

newsArray在我的.h作爲一個NSMutableArray聲明,它有一個屬性: @property (nonatomic, retain) NSMutableArray *newsArray;

我試過很多東西但在任何時候,事情都不起作用。 我使用iPhone SDK 4.2.1和儀器2.7運行XCode 3.2.5。

+0

你應該格式化你的代碼,以便它的可讀性。 – 2011-01-30 14:23:03

+0

你可以請格式化一些代碼?此外,你可以說,什麼工具說?請記住,mutablecopy不會構成數組的深層副本! – Icky 2011-01-30 14:24:23

+0

它只是顯示一個藍色的紅色堆棧。而且,該代碼格式正確嗎? – AppleL1nk 2011-01-30 19:09:49

回答

12

當你

self.newsArray = something; 

something被保留,因爲您添加retainnewsArray財產。

mutableCopy也返回一個保留計數增加1的對象。所以在該方法結束後,您的newsArray保留計數比您真正想要的高一個,即檢測到的內存泄漏。

解決方法:在您指定self.newsArray

self.newsArray = [[[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest error:nil] mutableCopy] autorelease]; 
3

mutableCopy使得副本,並保留它,所以你需要釋放你所創建的副本替換行。嘗試修改此:

self.newsArray = [[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest 
                 error:nil] mutableCopy]; 

要這樣:一邊

self.newsArray = [[[managedObjectContext executeFetchRequest:coreDataNewsFetchRequest 
                 error:nil] mutableCopy] autorelease]; 

作爲,創建您的應用程序委託類的新對象是有點不尋常,可能不會給你所期望的結果。傳統上您實例化一個應用程序委託(默認情況下這是在MainWindow.xib中爲你做),然後使用是指它在你的應用程序:

FooAppDelegate *appDelegate = (FooAppDelegate*)[[UIApplication sharedApplication] delegate];