7

次のコード例を考えると、newMutableArrray変数は2つの異なる初期化に応じて異なりますか、それとも同じですか?

NSArray *originalArray = @[obj1, obj2, oj3];

NSMutableArray *newMutableArray = nil;

if (thereIsSomeDifference) {  
    newMutableArray = [NSMutableArray arrayWithArray:originalArray];  
}  
else {  
    newMutableArray = [originalArray mutableCopy];  
} 
4

4 に答える 4

7

同じオブジェクトを (同じ順序で) 持つ場合、配列は別の配列 (isEqualToArray: セレクター) と同等です。これは isEqual: メソッドを使用して検証されます (配列が変更可能かどうかは無視されます)。

それらはまったく同じで、1 つまたは別の初期化を行っても違いはありません。isEqualToArray: の結果をログに記録することを確認します。

NSArray *originalArray = @[obj1, obj2, oj3];
NSMutableArray *newMutableArray = nil;
newMutableArray = [NSMutableArray arrayWithArray:originalArray];  
thereIsSomeDifference= ![newMutableArray isEqualToArray: [originArray mutableCopy] ];

変更不可能なコピーと比較した場合でも、比較は true になることに注意してください。

于 2013-01-06T20:38:26.963 に答える
1

答えるためには、「同一性」を定義する必要があります。2 つの init を並べると異なるコレクションになりますが、同じ要素を指している限りは同じになります。

言い換えると:

initA = [NSMutableArray arrayWithArray:originalArray];  
initB = [originalArray mutableCopy];

if (initA == initB) {
   // unreachable, because the pointers differ
}

// however
if ([initA isEqualToArray:initB]) {
   // will be true
   // because
   for (int i=0; i<initA.count; i++) {
       if ([initA objectAtIndex:i] == [initB objectAtIndex:i]) {
           NSLog(@"this will log every element %@ in the arrays", [initA objectAtIndex:i]);
       }
   }
}
于 2013-01-06T20:42:53.377 に答える
1

いいえ、それらの結果はまったく同じです。
初期化だけが違う

于 2013-01-06T20:36:48.510 に答える