2011-12-14 4 views
1

私はカテゴリと呼ばれる(非原子、保持)として宣言されたNSMutableArrayプロパティを持っています。 deallocでは、私はその変数のメモリを解放します。もともと、viewDidLoadでは、その配列を割り当てて、そのデータにダミーデータを設定する別のメソッドを呼び出しました。基本的にオートレリースされた変数を保持していますが、どこから解放しますか?

[categories addObject:someObject1]; 
[categories addObject:someObject2]; 
.... 

これは機能していました。

次に、モデルと話してオートレリーズされた配列を返した方法で、同僚から実際のデータを取得しました。私はメソッドを使用した後、EXC_BAD_ACCESSを取得していました。

categories = [datamanager GetCategories]; 

これは、私がdatamanagerのGetCategoriesメソッドから返された自動リリース配列を保持していないためです。

もしそうなら、私はviewDidLoadでalloc/initを削除する必要があります。これはメモリリークの権利でしょうか?

ありがとうございます。ちょうど私が正しくメモリ管理を理解していることを確認しようとしています。

答えて

4

あなたは正しい軌道にいると思います。 オートレリースされたオブジェクトを返すメソッドからcategoriesを取得する場合は、を保持し、そのオブジェクトを保持します。だから、次のいずれかの上にあなたの割り当てを変更することができます:viewDidLoad

// use the synthesized setter's retain 
self.categories = [datamanager GetCategories]; 

// or explicitly retain the object (which clearly indicates the code's intention) 
categories = [[datamanager GetCategories] retain]; 

のalloc/initが不要です。

+3

私は、 'self.'構文を使うのがベストプラクティスと言います。すでにObj-C 2.0のプロパティを宣言していますが、それを使うこともできます。 – darvids0n

+1

darvids0nに同意すると、特に設定者を無効にしているときにself.property =を直接設定するほうが望ましいですし、なぜ動作していないのか分かりません! –

+0

私は 'self.'構文が好ましいと思います。しかし、Obj-cのメモリ管理を学ぶ人にとっては、両方のオプションのしくみを理解することが重要です。 – SundayMonday

関連する問題