В Какао вы предпочитаете NSInteger или Int, и почему? - PullRequest
46 голосов
/ 17 августа 2008

NSInteger / NSUInteger - определенные Какао замены для обычных встроенных типов.

Есть ли польза от использования типов NS * по сравнению со встроенными? Что вы предпочитаете и почему? NSInteger и int имеют одинаковую ширину на 32-битных / 64-битных платформах?

Ответы [ 5 ]

56 голосов
/ 17 августа 2008

Насколько я понимаю, NSInteger et al. являются архитектурно-безопасными версиями соответствующих типов C. В основном их размер варьируется в зависимости от архитектуры, но NSInteger, например, гарантированно содержит любой действительный указатель для текущей архитектуры.

Apple рекомендует использовать их для работы с OS X 10.5 и более поздних версий, и API Apple будут использовать их, так что это определенно хорошая привычка использовать их. Они требуют немного большего набора текста, но кроме этого, похоже, нет никаких причин не использовать их.

43 голосов
/ 14 октября 2008

Проблемы квантования для 64-битной среды выполнения

В некоторых ситуациях может быть веская причина использовать стандартные типы вместо NSInteger: «неожиданное» увеличение объема памяти в 64-битной системе.

Очевидно, что если целое число равно 8, а не 4 байта, объем памяти, занятый значениями, удваивается. Учитывая, что не каждое значение является целым числом, вы, как правило, не должны ожидать, что объем памяти вашего приложения удвоится. Однако способ, которым Mac OS X выделяет память, изменяется в зависимости от запрошенного объема памяти.

В настоящее время, если вы запрашиваете 512 байт или меньше, malloc округляется до следующего кратного 16 байт. Однако, если вы запрашиваете более 512 байт, malloc округляется до следующего кратного 512 (не менее 1024 байт). Предположим, что вы определили класс, который, среди прочего, объявляет пять NSInteger переменных экземпляра и что в 32-битной системе каждый экземпляр занимает, скажем, 272 байта. В 64-битной системе экземпляры теоретически требуют 544 байта. Но из-за стратегии выделения памяти каждый фактически будет занимать 1024 байта (почти четырехкратное увеличение). Если вы используете большое количество этих объектов, объем памяти вашего приложения может быть значительно больше, чем вы могли бы ожидать. Если вы замените переменные NSInteger переменными sint_32, вы будете использовать только 512 байт.

Поэтому при выборе скаляра убедитесь, что вы выбрали что-то разумное. Есть ли какая-то причина, по которой вам нужно значение больше, чем в 32-битном приложении? Использование 64-разрядного целого числа для подсчета количества секунд вряд ли будет необходимо ...

18 голосов
/ 17 августа 2008

64-бит - фактически смысл существования NSInteger и NSUInteger; до 10.5 таких не было. Эти два значения просто определяются как long в 64-битном формате и как int в 32-битном:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Таким образом, используя их вместо более базовых типов C, когда вы хотите использовать «родной» размер.

CocoaDev имеет больше информации.

0 голосов
/ 19 апреля 2012

Для импорта и экспорта данных в файлы или по сети я использую UInt32 , SInt64 etc ...

Они гарантированно имеют определенный размер независимо от архитектуры и помогают переносить код на другие платформы и языки, которые также разделяют эти типы.

0 голосов
/ 17 августа 2008

Я предпочитаю стандартные объявления стиля c, но только потому, что я переключаюсь между несколькими языками, и мне не нужно слишком много думать об этом, но звучит так, как будто я должен начать смотреть на nsinteger

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