0

わかりました。非常によく似た2つのデータセットを使用していますが、同時に、これらのデータセットは両方ともオブジェクト内のグローバルNSMutableArrayです。

data_set_one = [[NSMutableArray alloc] init];
data_set_two = [[NSMutableArray alloc] init];

2つの新しいNSMutableArrayがロードされ、古い既存のデータに追加する必要があります。これらのアレイもグローバルです。

xml_dataset_one = [[NSMutableArray alloc] init];
xml_dataset_two = [[NSMutableArray alloc] init];

コードの重複を減らすために(そしてこれらのデータセットは非常に似ているため)、両方の配列のデータ結合プロセスを処理するために、クラス内にvoidメソッドを作成しました。

-(void)constructData:(NSMutableArray *)data fromDownloadArray:(NSMutableArray *)down withMatchSelector:(NSString *)sel_str

今、私はオブジェクト指向プログラミングについて十分に理解しているので、データ内のグローバル配列を使用してメソッドを呼び出すとしたら...

[self constructData:data_set_one fromDownloadArray:xml_dataset_one withMatchSelector:@"id"];

次に、グローバルNSMutableArrays(data_set_one)は、メソッド内の「配列」に発生する変更を反映します。残念ながら、これは当てはまりません。data_set_oneは、メソッド外の変更(例:配列内の新しいオブジェクト)を反映しません。

これが問題のコードスニペットです

// data_set_one is empty
// xml_dataset_one has a few objects

[constructData:(NSMutableArray *)data_set_one fromDownloadArray:(NSMutableArray *)xml_dataset_one withMatchSelector:(NSString *)@"id"];

// data_set_one should now be xml_dataset_one, but when echoed to screen, it appears to remain empty

そして、ここにメソッドのコードの要点があります。どんな助けでもありがたいです。

-(void)constructData:(NSMutableArray *)data fromDownloadArray:(NSMutableArray *)down withMatchSelector:(NSString *)sel_str {
    if ([data count] == 0) {
        data = down;  // set data equal to downloaded data
    } else if ([down count] == 0) {
        // download yields no results, do nothing
    } else { 
        // combine the two arrays here 
    }
}

このプロジェクトはARC対応ではありません。

助けてくれてありがとう!ロブ

4

1 に答える 1

0

私があなたの問題を理解した場合、あなたはオブジェクトを参照による呼び出しとして渡そうとしており、C ++/Cのように機能することを望んでいます。しかし、Obj-Cは似ていますが、いくつかの異なる方法があります。NSErrorの場合によく見られるように、**(ダブルポインタ)を使用してオブジェクトを逆参照する必要がありますが、これは非常にまれです。

2番目の方法は次のとおりです。ブロックとしてメソッドをラップします。次に、変数をブロックと同じ字句スコープに配置し、__blockストレージタイプで示します。

3番目の方法は、オブジェクトをivar / propertyまたはシングルトンにすることで、オブジェクトに直接アクセスすることです。

于 2012-12-08T11:45:46.800 に答える