2

私の目的: サーバーへの API 呼び出しを行い、それらから戻ってくるのは名前付きのデータdataArrの配列であり、後で必要になるためにこれらのデータを別の配列に保存したいと考えています。

私がこれまでに行っていることは、

myClass.h:

@propery ( nonatomic, retain ) NSArray *dataList;

myClass.m:

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

3 行目に記入するには、オプション A の 2 つのオプションがあります。

dataList = dataArr;

またはオプション B:

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

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

自分が正しい道を進んでいることを再確認したいだけです。

途中で間違っていたら訂正してください。ありがとう コメントは大歓迎です。

4

2 に答える 2

3
dataList = [dataArr];

これは有効なObjecitve-Cではありません。書きたいなら

dataList = dataArr;

プロパティセッターを介さずにインスタンス変数に直接アクセスしているため、これはまだ問題です。つまり、配列は保持されず、ひどくクラッシュします。

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

再び間違っています。がdataListと同じdataArrであり、オブジェクトの参照(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;
}
于 2012-05-07T16:23:15.477 に答える
1

@synthesize dataList を追加します。そのため、コンパイラはデフォルトのセッターを生成できます

次に、4 行目に次を追加します。

self.dataList = dataArr;

デフォルトのセッターは、正しい方法で解放と保持を担当します

于 2012-05-07T16:27:32.320 に答える