Цель C - Подклассы NSArray

Я пытаюсь подкласс NSArray, но он вылетает из приложения при попытке получить доступ к методу подсчета. я знаю это NSArray это кластер классов.

  • Но что это значит?
  • Есть ли способ обойти подкласс NSArray?

Я знаю, что я могу просто подкласс NSObject и мой массив в качестве переменной экземпляра, но я бы предпочел подкласс NSArray,

РЕДАКТИРОВАТЬ: Причина: я создаю карточную игру, у меня есть класс Deck который должен подкласс NSMutableArray иметь пару дополнительных методов (-shuffle, -removeObjects:, -renewи т.д.), и я думаю, что это будет выглядеть чище для подкласса NSArray вместо того, чтобы иметь вар.

5 ответов

Решение

Проблема с добавлением категории в такой класс заключается в том, что все экземпляры класса будут наследовать дополнительные методы. Это и не нужно (поскольку не каждый массив должен быть в состоянии перестановить и т. Д.), И опасно (потому что вы не можете извлечь выгоду из проверки типов, чтобы убедиться, что NSArray, на который вы ссылаетесь в данный момент, действительно тот, который должен был быть перетасован.).

Альтернативой может быть создание собственного класса Deck, который имеет NSMutableArray в качестве переменной экземпляра. Там вы можете определить действия в своей колоде в точности так, как вам бы хотелось, и тот факт, что вы используете NSMutableArray, становится деталью реализации. Это позволяет вам воспользоваться проверкой типов во время компиляции и изменить внутреннюю реализацию вашего класса Deck без изменения его клиентов. Например, если по какой-то причине вы решили, что NSMutableDictionary будет лучшим резервным хранилищем, вы можете внести все эти изменения в реализацию вашего класса Deck без изменения какого-либо кода, который создает и использует Deck.

Обычно вам не нужно создавать подкласс, но в любом случае Apple предлагает следующие предложения:

Любой подкласс NSArray должен переопределять примитивные методы экземпляра. count а также objectAtIndex:, Эти методы должны работать с резервным хранилищем, которое вы предоставляете для элементов коллекции. Для этого резервного хранилища вы можете использовать статический массив, стандартный объект NSArray или какой-либо другой тип данных или механизм. Вы также можете переопределить, частично или полностью, любой другой метод NSArray, для которого вы хотите предоставить альтернативную реализацию.

Вы на самом деле переопределить countметод? Как говорится, вы должны предоставить собственную структуру поддержки для элементов массива и переопределить предложенные методы, учитывая это..

Если вы просто добавляете новые методы и используете существующее хранилище резервных копий, то лучшим подходом является добавление категории в NSArray. Категории являются действительно мощной частью объектива C - см. Cocoadev для некоторых образцов.

NSMutableArray уже есть - (void)removeObjectsInArray:(NSArray *)otherArray;Лучше всего создать подкласс NSObject со свойством изменяемого массива.

В этом конкретном случае я бы перемешал массив, используя -sortedArrayUsingComparator: и сделать ваш компаратор случайным образом вернуть NSOrderedAscending или же NSOrderedDescending,

НАПРИМЕР:

NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
    ^(id obj1, id obj2) { 
     return random() %  2 ? NSOrderedAscending : NSOrderedDescending;
     }];
Другие вопросы по тегам