Что можно предположить о кластере классов NSMutableArray / NSArray? - PullRequest
0 голосов
/ 05 апреля 2010

Я знаю, что вы не должны использовать это, чтобы решить, стоит ли менять массив:

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

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

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

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

1 Ответ

4 голосов
/ 05 апреля 2010

Нет. Совсем не безопасно.

Если вы делаете:

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] Изменяемый: 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 существующего массива или если возвращаемый тип функции / метода гарантирует, что массив будет изменчивым.

...