2012-05-07 10 views
2

私の目的:サーバーへのAPI呼び出しを行い、それらから戻ってくるデータの配列はdataArrという名前の配列であり、これらのデータを後で必要とするために別の配列に格納したい。私はこれまでやっている何を別の配列、メモリ管理、目的のCにデータを保存する

myClass.hです:

@propery (nonatomic, retain) NSArray *dataList; 

myClass.m

@implementation myClass 
-(void)receivedData:(NSArray*) dataArr { 
    // ??? 
} 

3行目で埋めるために、私は2つのオプション、オプションAを持っています

dataList = dataArr; 

またはオプションB:

[dataList release]; 
[dataArr retain]; 
dataList = dataArr; 

私はdataListは、ヘッダファイルにretainとして宣言されているため、オプションAはそれを行うための正しい方法だと思います。したがって、セッターは、現在の配列(dataList)を解放し、受け取った配列(dataArr)を再度確保します。

私はちょうど私が正しい道にいることを再確認したいと思います。

真ん中に間違えた場合は、私を修正してください。ありがとう コメントは歓迎されています。

+0

正しいやり方で保持を担当しますプロパティセッター – rodowi

+0

私はそれを前に言った、私は再びそれを言うだろう...私はチームがARCに移動することを決めたので、嬉しいです。コードを書く時間が長くなり、保持/解放を忘れる心配もありません。 –

答えて

3
dataList = [dataArr]; 

これは無効です。Objecitve-C。あなたはまだだ

dataList = dataArr; 

を書きたい場合はノー行くあなたは、直接インスタンス変数をアクセスしてるしているプロパティのセッターを通じて、つまり、あなたの配列が保持されませんではないとして、それがひどくクラッシュします。

[dataList release]; 
[dataArr retain]; 
dataList = dataArr; 

もう一度間違っています。 dataListdataArrと同じで、オブジェクト(self)の参照が最後の参照であった場合は、割り当て解除され、次のretainメッセージが破られ、おそらく再びクラッシュする可能性があります。

あなたは(あなたが持っている)プロパティのセッターを持っている場合は、単にこれが正しく配列を保持します

self.dataList = dataArr; 

を書きます。ところで、セッターの実装では、あなたの最後の方法のようなものであるが、それはどちらかチェック不平等について:

- (void)setDataList:(NSArray *)dl 
{ 
    if (dataList != dl) 
    { 
     [dataList release]; 
     dataList = [dl retain]; 
    } 
} 

または事前retainのオブジェクトを設定する:

- (void)setDataList:(NSArray *)dl 
{ 
    [dl retain]; 
    [dataList release]; 
    dataList = dl; 
} 
1

は追加します@データリストを合成する。ので、コンパイラは、その行4アドオンでデフォルトのセッター

を生成することができます。

self.dataList = dataArr; 

デフォルトのセッターが解除し、あなたが呼び出すためにself.dataListを使用する必要があります