Неверное ли поведение [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.

Другие вопросы по тегам