Этот вопрос возник из-за этого один. Работа со списками структур в какао непростая. Либо используйте NSArray и кодируйте / декодируйте, либо используйте массив типа C и потеряйте товары NSArray. Предполагается, что структуры должны быть простыми, но когда нужен список, вместо него можно создать класс.
Когда в какао имеет смысл использовать списки структур?
Я знаю, что уже есть много вопросов относительно структур и классов, и я читал, как пользователи утверждают, что это один и тот же ответ для каждого языка, но, по крайней мере, какао должно иметь свои собственные конкретные ответы на этот вопрос, хотя бы из-за KVC или привязок (как Петр предложил по первому вопросу).





Какао имеет несколько общих типов, которые являются структурами, а не объектами: NSPoint, NSRect, NSRange (и их аналоги CG).
Если сомневаетесь, следуйте примеру Какао. Если вы обнаружите, что имеете дело с большим количеством небольших объектов, в основном данных, вы можете вместо этого сделать их структурами для повышения эффективности.
Использование NSArray / NSMutableArray в качестве контейнера верхнего уровня и упаковка структур в NSValue, вероятно, значительно упростят вашу жизнь. Я бы пошел к прямому массиву C-типа только в том случае, если вы обнаружите, что NSArray является узким местом производительности, или, возможно, если массив по существу доступен только для чтения.
В общем, использование структуры подразумевает существование относительно простого типа данных, который не имеет связанной с ним логики и не должен иметь связанную с ним какую-либо логику. Возьмем, к примеру, NSPoint - это просто представление (x, y). Учитывая это, также возникают некоторые проблемы, связанные с его использованием. В общем, это нормально для этого типа данных, поскольку мы обычно наблюдаем изменение точки, а не координату y точки (по сути, (0,1) не то же самое, что (1,1) смещенный вниз на 1 единицу). Если это нежелательное поведение, возможно, лучше использовать класс.
Иногда удобно и полезно использовать структуры, особенно когда вам нужно перейти на C, например, при работе с существующей библиотекой или при выполнении каких-либо задач на системном уровне. Иногда вам просто нужна компактная структура данных без накладных расходов класса. Если вам нужно много экземпляров таких структур, это может реально повлиять на производительность и объем памяти.
Другой способ создать массив структур - использовать класс NSPointerArray. Для настройки требуется немного больше усилий, но после этого он работает почти так же, как NSArray, и вам не нужно беспокоиться о упаковке / распаковке или упаковке в класс, поэтому доступ к данным более удобен, и это не так. занять дополнительную память класса.
NSPointerFunctions *pf = [[NSPointerFunctions alloc] initWithOptions:NSPointerFunctionsMallocMemory |
NSPointerFunctionsStructPersonality |
NSPointerFunctionsCopyIn];
pf.sizeFunction = keventSizeFunction;
self.pending = [[NSPointerArray alloc] initWithPointerFunctions:pf];
Для людей, использующих iPhone SDK: NSPointerArray недоступен для iPhone.
NSPointerArray доступен на iPhone с iOS 6.0+
KVC и привязки - не единственные две причины сделать что-то объектом. Среди прочего, можно поместить его в объект коллекции без необходимости упаковывать / распаковывать. Вы также можете легко проверить, является ли что-либо объектом этого типа, что невозможно со структурами.