Неверное ли поведение [NSMutableIndexSet copy]?
Посмотрите на следующие два утверждения:
NSMutableIndexSet *selectedRows = [[[NSMutableIndexSet alloc] initWithIndexSet:[_dataTableView selectedRowIndexes]] autorelease];
NSMutableIndexSet *rowsToDelete = [[selectedRows copy] autorelease];
Я ожидал, что rowToDelete будет NSMutableIndexSet, но его NSIndexSet. Похоже, что копия не реализована в NSMutableIndexSet. Если это так, разве это не большая ошибка - не реализовывать копию даже для такого базового типа? или мне не хватает чего-то фундаментального для интерфейса IndexSet?
2 ответа
Да, поведение правильное.
Вы, вероятно, смущены разницей между copy
а также mutableCopy
,
copy
возвращает объект, возвращенный copyWithZone:
, Это, в свою очередь, вернет неизменный вариант, если у класса есть как неизменный, так и изменчивый вариант.
Смотрите обсуждение в документации дляcopyWithZone:
:
Возвращенная копия является неизменной, если к получающему объекту применяется соображение "неизменяемый и изменяемый"; в противном случае точный характер копии определяется классом.
Копировать возвращает неизменяемую копию. Если вы хотите получить изменяемую копию, вы должны отправить сообщение "mutableCopy" в класс, который реализует протокол NSMutableCopying. Как видно из документации разработчика, NSMutableIndexSet соответствует протоколам NSMutableCopying и NSCopying: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableIndexSet_Class/Reference/Reference.html.