2011-07-03 8 views
1

NSMutableArrayクラスのオブジェクトを返す非voidインスタンスメソッドで別のメモリリークが発生しています。目的C:非voidインスタンスメソッドのメモリリーク

enter image description here

誰かが、私はこのリークを修正することができますどのように私に助言することはできますか?私はメソッドの最後に 'userFollowings'をリリースしようとしましたが、まだ漏れを報告しています。

答えて

9

で終わる試してみてください、それは自動解放を返すのが一般的です。そうすれば、オブジェクトを受け取ったユーザはそれを解放することを心配する必要はない。だから、コードのあなたの最後の行は次のようになります。

return [userFollowing autorelease]; 

これはおそらく、このようなメモリ管理規則に追いつくために Memory Management Programming Guideから少しを読み取るために損はない、とたくさんあり

ウェブ上とこのサイト上の他の有益なリソースを参照してください。

2

問題は、userFollowingsがリリースされないことです。あなたは、あなたがどちらかそれを、それを初期化したり保持している方法からオブジェクトを返すようにしている場合は

return [userFollowings autorelease]; 
3

ココアプログラムで使用されるa set of conventionsがあり、メモリ管理がエラーを起こしにくくなりました。メソッドがオブジェクトを返すとき、メソッドを呼び出すコードは、オブジェクトを所有しているかどうかを知る必要があります。それはつまるところ何

は、オブジェクトを返すメソッドを書いているし、その方法は、などnewalloccopy、のようなものを命名されることにより、発信者により所有権を伝えていない場合、あなたはautoreleaseする必要があることですあなたがそれを返す前に。

これは、あなたが得意とするメッセージの内容です。"オブジェクトが所有者の参照として呼び出し元に返されました"は、呼び出し元コードの所有権を譲渡していることを意味します。問題は、メソッド名がそうでないことを示していることです。

私があなたのメソッドを呼び出してオブジェクトにハングアップする必要があった場合は、retainを呼び出して所有していました。あなたのメソッド名が私が所有者ではないことを暗示しているので、これを行う必要があります。オートレリースされたオブジェクトを返す限り、それは正しいです。しかし、あなたがオブジェクトをオートレアしないと、それは2の保持カウントで終わるでしょう - あなたがそれを割り当てたときと私がそれを保持したとき、一度。私は最終的にそれを解放することにラウンドを取得すると、それはまだ保持カウント1を持ち、決してメモリから解放されず、メモリリークが発生します。

1

これを試してみてください:

NSMutableArray* userfollwings = [[[NSMutableArray alloc] init] autorelease]