Получение от NSArray
- это то, чего вам следует избегать. Из документации:
Помните, что NSArray является общедоступным интерфейсом для кластера классов и что это влечет за собой для вашего подкласса. Примитивные методы NSArray не включают никаких назначенных инициализаторов. Это означает, что вы должны предоставить хранилище для вашего подкласса и реализовать примитивные методы, которые непосредственно воздействуют на это хранилище.
Это означает, что при инициализации массива вы не получаете экземпляр NSArray
. Вы получите экземпляр совершенно другого класса, который просто имеет тот же интерфейс. Вот почему создание подклассов не работает так, как вы думаете: вы должны полностью реализовать хранилище самостоятельно. Вот почему в документации говорится:
Любой подкласс NSArray должен переопределять примитивные методы экземпляра count и objectAtIndex :. Эти методы должны работать с резервным хранилищем, которое вы предоставляете для элементов коллекции. Для этого резервного хранилища вы можете использовать статический массив, стандартный объект NSArray или какой-либо другой тип данных или механизм. Вы также можете переопределить, частично или полностью, любой другой метод NSArray, для которого вы хотите предоставить альтернативную реализацию.
И последнее, но не менее важное: у вас в любом случае была бы неправильная инициализация. Вам нужно было бы позвонить super
:
- (id)init
{
self = [super initWithObjects:@"One", @"Two", nil];
if (!self) return nil;
return self;
}
Но, как я только что сказал, это не так легко работает. Вы получите то же самое исключение снова. Так что вам следует просто избегать производных от NSArray
.
Что вы можете сделать - это добавить категорию для добавления методов ко всем NSArray
экземплярам.