Имеет ли смысл использование списков структур в какао?

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

Когда в какао имеет смысл использовать списки структур?

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

KVC и привязки - не единственные две причины сделать что-то объектом. Среди прочего, можно поместить его в объект коллекции без необходимости упаковывать / распаковывать. Вы также можете легко проверить, является ли что-либо объектом этого типа, что невозможно со структурами.

Peter Hosey 27.12.2008 01:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
1 930
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Какао имеет несколько общих типов, которые являются структурами, а не объектами: 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.

Felixyz 06.12.2009 18:00

NSPointerArray доступен на iPhone с iOS 6.0+

Aaron 12.12.2013 01:24

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