0

次のコードを使用して、インスタンスを作成し、プロパティを割り当て、配列に追加しようとしています。次に、新しいプロパティを割り当てて、再度追加します。ただし、配列には2つの同一のオブジェクトが含まれます(2番目に追加されたものと同じ)。クラス Message には、いくつかの (非アトミック、保持) NSStrings/Integer プロパティがあります。これはおそらく私のポインターの理解と関係がありますが、誰か説明できますか?

    self.messages=[[NSMutableArray alloc]init];
    Message *m=[[Message alloc]init];
    m.cb=@"2402";
    m.ck=1001;
    m.msg=@"as";
     [self.messages addObject:m];

    m.cb=@"2422";
    m.ck=1002;
    m.msg=@"aadfsdsdfdssdklsdflkh";
    [self.messages addObject:m];
    NSLog(@"%@",self.messages);
4

3 に答える 3

5

オブジェクトを配列に追加すると、オブジェクトのコピーは配列に追加されませが、代わりにオブジェクトへの参照が追加されます。2つの異なるオブジェクトが必要な場合は、同じオブジェクトを再利用するのではなく、2つの異なるオブジェクトを作成する必要があります(または、@ Brendonが指摘しているように、配列に追加するときにコピーを作成します)。

例を修正するための最も一般的な手法は、2番目のオブジェクトのプロパティの変更を開始する直前に次の行を追加することです。

m=[[Message alloc]init];

または、を再利用する代わりに、2番目のポインタとオブジェクトを使用しmます。

編集:
コピーを追加するには、クラスがプロトコル に準拠していると仮定して、に変更[self.messages addObject:m];します。[self.messages addObject:[m copy]];MessageNSCopying

于 2013-02-19T19:54:05.863 に答える
0

はい、投稿されたコードを実行した後、インデックス0と1にオブジェクトが2回self.messages含まれていますが、それは問題ではありません。Message配列には、それ自体も含め、任意のオブジェクトを含めることができます。

2つの異なるオブジェクトが必要なようですので、2つ目のオブジェクトを作成するだけですMessage

于 2013-02-19T19:54:15.203 に答える
0

lnafziger が述べたように、NSCopy プロトコルを実装するか、for ループで新しいインスタンスを非常に簡単に作成することができます。

«2 つ以上、for を使用»
— Edsger W. Dijkstra

self.messages=[[NSMutableArray alloc] init];
NSArray *dataArray = @[ @{@"cb": @"2402", @"ck": @(1001), @"msg": @"as"}, 
                        @{@"cb": @"2422", @"ck": @(1002), @"msg": @"aadfsdsdfdssdklsdflkh"}
                      ];


for(NSDictionary *data in dataArray) {
    Message *m=[[Message alloc] init];
    m.cb = data[@"cb"];
    m.ck = [data[@"ck"] integerValue];
    m.msg = data[@"msg"];
    [self.messages addObject:m];
}
于 2013-02-19T22:37:18.047 に答える