2011-06-22 2 views
4

Итак, я создаю приложение для iPhone в Objective-C и вам нужно использовать массив. Обычно в Objective-C я использую NSArray или NSMutableArray, но я начинаю задаваться вопросом, является ли это лучшей идеей при простом использовании базового массива. Имеет ли смысл использовать память и эффективность в использовании обычного массива C или массива Objective-C, просто сохраняя базовый массив пользовательских объектов? И обычно вы используете C-массивы или массивы Objective-C при программировании в Objective-C? Благодаря!C/C++ vs Objective-C Array

+0

+1 Я думаю об этом, когда хочу массив массивов, например. Преобразование в NSNumber и из него - боль и, вероятно, неэффективность. – PengOne

ответ

5

Это действительно зависит от того, что вы хотите сделать с массивом.

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

Однако объекты Cocoa имеют ряд инвариантов управления памятью, которые вы должны соблюдать, или ваше приложение будет работать. C-массивы и векторы C++ будут блаженно игнорировать эти требования, что означает гораздо большую работу для вас, чтобы держать их в очереди. NSArray позаботится об этом для вас. Когда вы имеете дело с объектами Cocoa, используйте NSArray.

+0

Спасибо, что ответил на мой вопрос.Думаю, я просто использую классы Cocoa в этой ситуации. Тем не менее, я вижу, откуда вы пришли, когда выполняете математику на массивах, и я буду помнить об этом, когда делаю что-то подобное. –

0

NSArray и NSMutableArray являются достаточно эффективными. Если производительность пока не является проблемой для вас, нет никаких оснований для того, чтобы скомбинировать себя с использованием простых массивов C, когда объекты Objective-C были бы более естественными - если производительность становится проблемой позже, тогда вы можете оптимизировать ее больше.

1

Когда в Риме.

Используйте NSArray или NSMutableArray при разработке приложений для iPhone, поскольку это идиоматическая задача.

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

3

Если я не нашел повод для не их использовать, NSArray - это мой де-факто выбор.

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

0

Объективные массивы C (NSArray, et.al.) крайне неэффективны, если вы пытаетесь использовать их для обработки выборок многоканальных аудио и/или необработанных пикселей в реальном времени видео в реальном времени, бит, который вы нужно прикасаться к порядку много миллионов раз в секунду. Обычные C массивы данных, изложенные в некоторых каналах информации о кеше данных, гораздо более уместны и, вероятно, будут использовать гораздо меньше памяти и мощности батареи для любой значительной обработки.

Обратите внимание, что вы не можете даже подавать NSArrays в инфраструктуру Accelerate и большую часть Core Audio, Core Graphics или Open GL API.

Для данных, которые вы редко слышите, скажем, со скоростью всего в несколько тысяч раз в секунду или меньше, массивы Objective C помогут с управлением памятью и абстракцией данных, возможно, без ущерба для времени и памяти, которые легко измеримы. Полезно для пользовательских данных, элементов пользовательского интерфейса, таблиц пользовательского интерфейса и других очень медленных вещей, которые происходят только в просто темпах человека.