2011-01-30 12 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はNSMutableArrayのように私の.hで宣言され、それが財産を持っている: @property (nonatomic, retain) NSMutableArray *newsArray;

私は多くのことを試してみましたしかし、常にそのことは機能していませんでした。 iPhone SDK 4.2.1とInstruments 2.7でXCode 3.2.5を実行しています。

+0

コードを読み込み可能にする必要があります。 –

+0

コードを少しフォーマットしてください。また、どのような楽器が言っているのですか? mutablecopyは配列のディープコピーを作成しないことに注意してください。 – Icky

+0

それはちょうど1つの青の上に1つの赤いスタックを私に示しています。そして、そのコードの書式は正しいですか? – AppleL1nk

答えて

12

あなたがnewsArrayプロパティにretainを追加したのでsomethingが、保持されていることを

self.newsArray = something; 

を行います。

しかしmutableCopyもそうメソッドが終了した後に1増加保持カウントを持つオブジェクトを返します、あなたのnewsArrayが検出されたメモリリークで数あなたが本当に欲しいものよりも高いものを、保持しています。

ソリューション:交換してくださいあなたは

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

秒でそれに私を打つ。 :-) –

+0

mruegありがとう、私はそれが動作しないと思ったので、私はそれを試していない。もう一度ありがとうございます:D – AppleL1nk

3

mutableCopyself.newsArrayを割り当てる行がコピーを作成し、それを保持するので、あなたが作成したコピーを解放する必要があります。これに

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

:これを変更してみてくださいさておき、アプリのデリゲートクラスの新しいオブジェクトを作成することは少し珍しいですし、あなたが期待する結果が得られない場合がありますよう

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

。従来は、1つのアプリケーションデリゲートをインスタンス化していました(デフォルトではMainWindow.xibでインスタンス化されています)。

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

これはすでに私には私が望む結果を与えるが、私はappDelegateをリリースする必要があり、私はそれをリリースするか分からない:( – AppleL1nk

関連する問題