1

これは私のコードです。

NSString* seats = @"NEWS";
NSMutableString *sp = [[NSMutableString alloc] initWithString:@"             "];
NSArray *dials=@[@[sp, sp, sp, sp], @[sp, sp, sp, sp]];
[dials[0][2] replaceCharactersInRange:NSMakeRange(5, 1) withString:[seats substringWithRange:NSMakeRange(3,1)]];
NSLog(@"dial 0 0 : %@",dials[0][0]);
NSLog(@"dial 0 1 : %@",dials[0][1]);
NSLog(@"dial 0 2 : %@",dials[0][2]);
NSLog(@"dial 0 3 : %@",dials[0][3]);

これは私のコンソールの読み取りです。

2013-02-08 08:23:26.114 [29075:11303] dial 0 0 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 1 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 2 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 3 :      S       

代わりに、次の読み取り値を取得するにはどうすればよいですか?

2013-02-08 08:23:26.114 [29075:11303] dial 0 0 :              
2013-02-08 08:23:26.115 [29075:11303] dial 0 1 :              
2013-02-08 08:23:26.115 [29075:11303] dial 0 2 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 3 :              
4

1 に答える 1

3

これを行うだけで:

NSArray *dials=@[@[sp, sp, [sp mutableCopy], sp], @[sp, sp, sp, sp]];

なぜですか?よく考えれば、その配列には重複したオブジェクトが含まれているだけです。すべてのポインターは、コピーされたオブジェクトを指している dials[0][2] を除いて、同じオブジェクトを指しています。

重複したオブジェクトを同じ配列に入れることは許可されていますが、概念的に間違っている可能性があります。したがって、すべてのオブジェクトをコピーすることも検討してください。

別の解決策は、不変の配列を可変の文字列に置き換え、可変の配列を不変の文字列に置き換えることです。この場合、重複したオブジェクトを配置することもできます。オブジェクトを変更するには、それを置き換える必要があります。

NSString *sp = @"             ";
NSArray*dials=@[[@[sp, sp, sp, sp]mutableCopy], [@[sp, sp, sp, sp]mutableCopy]];
NSString* replace= [dials[0][2] stringByReplacingCharactersInRange:NSMakeRange(5, 1) withString:[seats substringWithRange:NSMakeRange(3,1)]];
[dials[0] replaceObjectAtIndex: 2 withObject: replace];
于 2013-02-08T14:02:26.197 に答える