Имеет ли смысл использовать списки структур в какао? - PullRequest
5 голосов
/ 26 декабря 2008

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

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

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

Ответы [ 3 ]

11 голосов
/ 26 декабря 2008

Какао имеет несколько общих типов, которые являются структурами, а не объектами: NSPoint, NSRect, NSRange (и их аналоги CG).

Если сомневаетесь, следуйте указаниям Какао. Если вы обнаружите, что имеете дело с большим количеством небольших объектов, в основном с данными, вы можете вместо этого сделать их структурами для повышения эффективности.

Использование NSArray / NSMutableArray в качестве контейнера верхнего уровня и упаковка структур в NSValue, вероятно, значительно облегчит вашу жизнь. Я бы пошел к прямому массиву C-типа, если бы вы обнаружили, что NSArray является узким местом производительности, или, возможно, если массив по сути только для чтения.

2 голосов
/ 16 января 2009

Иногда удобно и полезно использовать структуры, особенно когда вам нужно перейти на C, например, при работе с существующей библиотекой или при выполнении задач системного уровня. Иногда вам просто нужна компактная структура данных без затрат класса. Если вам нужно много экземпляров таких структур, это может оказать реальное влияние на производительность и объем памяти.

Еще один способ сделать массив структур - использовать класс NSPointerArray . Настройка требует немного больше времени, но после этого она работает почти так же, как NSArray, и вам не нужно беспокоиться о блокировке / распаковке или переносе в классе, так что доступ к данным более удобен и не занять дополнительную память класса.

NSPointerFunctions *pf = [[NSPointerFunctions alloc] initWithOptions:NSPointerFunctionsMallocMemory |
                          NSPointerFunctionsStructPersonality |
                          NSPointerFunctionsCopyIn];
pf.sizeFunction = keventSizeFunction;
self.pending = [[NSPointerArray alloc] initWithPointerFunctions:pf];
1 голос
/ 05 января 2009

Как правило, использование структуры подразумевает существование относительно простого типа данных, который не имеет логики, связанной с ним, и не должен иметь никакой логики, связанной с ним. Возьмите, например, NSPoint - это просто (x, y) представление. Учитывая это, есть также некоторые проблемы, которые возникают из-за его использования. В целом, это нормально для данных этого типа, так как мы обычно наблюдаем изменение точки, а не координаты y точки (по сути, (0,1) не совпадает со смещением (1,1) на 1 единицу). Если это нежелательное поведение, лучше использовать класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...