2012-01-24 13 views
0

私はObjective-Cの新機能です。メソッド内でクラス変数を設定してから解放しようとすると、ランタイムエラーが発生しました。私はランタイムエラーを取り除く唯一の方法は、それをリリースすることではないことに気づいた。
メソッド内にクラス変数が設定されている場合、tempメソッド変数を解放する必要はありませんか?メソッド内でクラスプロパティを設定するときに、それを解放する必要がありますか?

- (void)initData{ 
     NSMutableArray *tmpData = [[NSMutableArray alloc] init]; 

     self.data = tmpData; 

     [tmpData release]; 
} 
+1

データの宣言も含めることができますか? – iccir

+0

@iccirは正しいです - より多くのコードが必要です。 'tmpData'を解放すると、' tmpData'と 'self.data'の両方が指し示すオブジェクトがメモリから解放されます。 – piersadrian

+1

「クラスプロパティ」や「クラス変数」などはありません。あなたが意味するものを明確にしてください。 –

答えて

2

dataプロパティが「保持」または「コピー」属性で宣言された場合に何を持っていることは正しいです:

私のコードは次のようなものが見えました。 dataが「割り当て」属性(デフォルト)で宣言されている場合は、クラッシュする可能性があります。その場合の解決策は、dataの場合はretain(またはcopy)を使用します。

@property (nonatomic, retain) NSMutableArray *data; 
+0

または 'strong'はMRCの下では' retain'の同義語であり、ARCの下では 'retain'の代わりです。 –

+2

MRCでは、 'initData' *はオブジェクトを所有しているため(' alloc'で作成したため)、プロパティの宣言に関係なく '[tmpData release]'、*を送信しなければなりません。帰りたい'tmpData'を解放しなければ、それはリークします。プロパティが 'strong' /' retain'または 'copy'として宣言されていて、リリースがまだクラッシュする場合、バグは他の場所にあり、質問者はInstrumentsでそれを狩らなければなりません。 –

+1

ありがとうございます。私のプロパティの設定は次の通りです:@property(非原子、代入)NSMutableArray * data;だから私の理解は、この変数にオブジェクトを代入すると "assign"は参照カウントをインクリメントしませんが、 "retain"は参照カウントをインクリメントしますが、問題なくローカルメソッド変数を解放できます。 –

関連する問題