NSArray, Примитивные типы и бокс Oh My! - PullRequest
2 голосов
/ 13 ноября 2009

Я довольно новичок в мире Objective-C, и у меня долгая история с .net / C #, поэтому, естественно, я склонен использовать свой ум C #.

Теперь вот вопрос: я чувствую себя действительно склонным к созданию некоторого типа простого набора Objective-C для хранения примитивных типов, потому что мне не нравится вся концепция оборачивания примитивного типа в объект (а именно NSNumber), а затем добавить его в коллекцию, такую ​​как NSArray.

Дело в том, что я полностью понимаю, что NSArray работает только с объектами. Однако для меня просто глупо, что мы вынуждены работать с примитивами в штучной упаковке только потому, что не существует коллекции, например, для работы с примитивными целыми числами.

Так что ребята из C # будут знать, о чем я говорил в старые времена с .net. Обычно вы либо используете простой массив, либо ArrayList, когда дженериков еще не было. ArrayList по сути вынудил вас упаковать ваши примитивные типы, но на самом деле он сделал это за кулисами, и вы заплатили за это дорогую цену (с точки зрения производительности).

Если вы не можете справиться с затратами на производительность, вы свернули собственную коллекцию или в итоге использовали дженерики, когда они вышли.

Сейчас в мире Objective-C это кажется, что мы вынуждены снова заняться этой проблемой, но разработчикам Apple все равно, или это не имеет большого значения или что-то в этом роде.

Итак, мой вопрос: какова рекомендуемая практика здесь? Должен ли я попытаться создать свои собственные коллекции Objective-C для хранения NSInteger, например? Или я должен просто использовать собственный массив C, как подсказывает коллега по программированию в этом сообщении в блоге: производительность NSArray vs. C Array

Или я просто использую встроенные коллекции Apple и кусаю пулю. Это говорит о том, что характеристики производительности, описанные в Memo, стоит учитывать при создании приложений, критичных для производительности.

Этот пост был полным, но мне пришлось снять его с груди.

Ответы [ 4 ]

2 голосов
/ 13 ноября 2009

Лично я бы предложил использовать цель C ++ и std :: vector <>; если у вас нет необходимости использовать собственный целевой контейнер C, в котором вы застряли с использованием объектов.

0 голосов
/ 17 декабря 2012

Переход массива 'C' через malloc требует рассмотрения жизненного цикла владельца массива, чтобы освободить его. Другие соображения, например ARC, изменение размера массива и т. Д. Делают подход «обертывания» привлекательным. Единственные причины, по которым я вижу «стиль C», это то, что проект является портом или основан на результатах профилировщика. Если вы решили «обернуть», рассмотрите такой подход, как NSArray + Primitive , который создает категорию для добавления функциональности примитивного типа в NSArray и NSMutableArray.

0 голосов
/ 13 ноября 2009

Мне никогда не требовался динамический массив целых чисел, потому что всегда было лучшее решение проблемы, которую я пытаюсь решить. Например, NSData может хранить массив байтов, или вы можете использовать NSIndexSet, если это набор целых чисел, который вы хотите.

Вы также можете использовать CFArrayCreate и передавать в соответствующие функции обратного вызова (и обернуть его в Objective-C, если хотите).

У вас есть конкретная проблема, которую вы пытаетесь решить?

0 голосов
/ 13 ноября 2009

Если вы хотите хранить только NSIntegers, можете ли вы просто использовать обычный массив C?

Редактировать: если вы делаете это по соображениям производительности, для меня это звучит как преждевременная оптимизация.

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