2010-04-05 2 views
0

Я знаю, что вы не должны использовать это, чтобы решить, следует ли изменить массив:Что можно предположить о кластере классов NSMutableArray/NSArray?

if ([possiblyMutable isKindOfClass:[NSMutableArray class]]) 

Но сказать, что я пишу метод и нужно возвращать либо NSMutableArray или NSArray, в зависимости от изменяемости от possiblyMutable. Класс, использующий мой метод, уже знает, приемлемо ли изменить возвращаемый массив. Независимо от того, приемлемо ли изменение возвращаемого массива напрямую коррелировать с тем, приемлемо ли изменение possiblyMutable.

В этом конкретном случае этот код безопасен? Мне кажется, что если не приемлемо для изменения массива, но мы случайно получим изменяемый массив, это нормально, потому что класс с использованием моего метода не будет пытаться его изменить. И если это является приемлемым для изменения массива, тогда мы будем всегда получить possiblyMutable как NSMutableArray (хотя это часть, о которой я не совсем понимаю).

Итак ... безопасно или нет? Альтернативы?

+0

Почему бы не использовать '-mutableCopy', если вам действительно нужен изменяемый массив? – kennytm

ответ

4

Нет. Небезопасно.

Если вы:

NSMutableArray * ma = [NSMutableArray arrayWithObject:@"foo"]; 
NSArray * aa = [NSArray arrayWithObject:@"foo"]; 

NSLog(@"Mutable: %@", [ma className]); 
NSLog(@"Normal: %@", [aa className]); 

Тогда вы получите:

2010-04-05 13: 17: 26,928 EmptyFoundation [55496: a0f] Mutable: NSCFArray
2010-04- 05 13: 17: 26,956 EmptyFoundation [55496: a0f] Нормальный: NSCFArray

Вы также не можете сделать:

NSLog(@"Mutable add: %d", [ma respondsToSelector:@selector(addObject:)]); 
NSLog(@"Normal add: %d", [aa respondsToSelector:@selector(addObject:)]); 

Поскольку это входит:

2010-04-05 13: 18: 35.351 EmptyFoundation [55525: a0f] Мутабельная надстройка: 1
2010-04-05 13: 18: 35.351 EmptyFoundation [ 55525: a0f] Нормальные добавить: 1

единственные способы гарантировать вас есть изменяемый массив должны взять -mutableCopy существующий массив или если возвращаемый тип функции/методы гарантирует массив будет изменчивым.

+3

Чтобы быть более явным, не должно быть ситуации, когда вы относитесь к изменяемым массивам и нормальным массивам по-разному. Для этого вам нужно будет конкретно передавать информацию об изменчивости массива с момента его создания, и это хрупкий кошмар. В противном случае вы всегда должны либо скопировать, либо mutableCopy массив в зависимости от того, что вы хотите. – Chuck

+0

Как работает NSCoding? Скажем, у меня есть массив изменяемых массивов, и я кодирую его. После декодирования мне нужно пройти через массив и отправить 'mutableCopy' в каждый из подмассивов? – andyvn22

+1

Нет, NSCFArray отслеживает свою внутреннюю изменчивость (как частную деталь реализации). NSCoding поступит правильно, поскольку NSCFArray получает возможность определять свою собственную кодировку и декодирование. –

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