2013-01-06 2 views
7

Учитывая следующий пример кода, является ли переменная newMutableArrray различной в зависимости от двух разных инициализаций или же?NSMutableArray arrayWithArray сравнивается с NSArray mutableCopy?

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

NSMutableArray *newMutableArray = nil; 

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

Что такое 'thereIsSomeDifference'? – NSAddict

+0

'thereIsSomeDifference' - это гипотетическое условие, для которого я хотел бы инициализировать newMutableArray одним или другим способом. В этом суть вопроса, потому что, если нет никакой разницы, как указывает ваш ответ, условие 'thereIsSomeDifference' не существует. – seeker12

ответ

6

Массив равен другому массиву (isEqualToArray: selector), если они имеют одинаковые объекты (в том же порядке). Это проверяется с использованием метода isEqual: (без учета изменяемого массива или нет).

Они такие же, одна или другая инициализация не имеет никакого значения. Убедитесь, что это результат регистрации isEqualToArray:.

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

Обратите внимание, что сравнение было бы правильным, даже если вы сравнили его с не изменяемой копией.

+0

Благодарим за редактирование, чтобы предоставить дополнительные пояснения. Отличный ответ. – seeker12

+0

Добро пожаловать. –

+2

Вы должны пояснить, что два массива равны, если объекты внутри одинаковы ** и ** объекты находятся в том же порядке. – rmaddy

1

Нет, результат их в точности такой же.
Только инициализация различна

+0

Спасибо за ваш ответ. Я принял ответ @Ramy Al Zuhouri только потому, что появился перед вами. – seeker12

+2

@ искатель12 Моя первая была на самом деле, но это не имеет значения, его ответ был лучше. – NSAddict

1

Чтобы ответить, мы должны определить «одинаковость». Эти две стороны бок о бок будут приводить к различным коллекциям, но они будут такими же, поскольку они указывают на одни и те же элементы.

Другими словами:

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]); 
     } 
    } 
} 
+0

Я полагаю, что «сходство» будет определяться как «... они указывают на те же элементы». Каким образом эти две коллекции будут отличаться? – seeker12

+0

Как я указал, они не пройдут глубокий тест равенства a == b. – danh

+0

А, ок. Я был сбит с толку, так как мой пример инициализирует одну переменную одним из двух способов, основанный на каком-то определенном состоянии, а не «... два init бок о бок ...». Хорошая точка зрения. Спасибо за дополнительное объяснение. – seeker12

15

НЕТ !!! Существует два различия между этими инициализациями:

  1. сохранить счетчик: в первом случае вы получите autoreleased объект, во втором случае вы получите удерживаемой объект, вам нужно будет выпустить его после того, как (это не применяется к ARC)

  2. Если originalArray равен нулю, в первом случае вы получите измененный массив с 0 элементом, во втором случае вы получите nil (поскольку отправка сообщения в nil возвращает nil). В вашем примере ясно, что originalArray не ноль, но в реальной жизни вы можете достичь этого случая (я только что имел дело)

Смежные вопросы