В Какао вы предпочитаете NSInteger или Int, и почему?

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

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

17.08.2008 17:01:45
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

57
17.08.2008 17:20:31
Это не обязательно так - см. Мой ответ "Проблемы с uantisation для 64-битной среды выполнения".
mmalc 14.10.2008 01:09:00

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

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

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

18
24.10.2013 16:32:29
Ссылка больше не доступна.
Akshit Zaveri 24.10.2013 12:51:03
Кажется, у нового CocoaDev нет этой статьи на данный момент.
Sören Kuklau 24.10.2013 16:32:22
Да, это не так. & В будущем, пожалуйста, не размещайте ссылки .. если возможно, напишите ответ здесь. Это противоречит правилам ответа stackoverflow, чтобы публиковать только ссылки ..
Akshit Zaveri 24.10.2013 18:37:23

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

0
17.08.2008 17:58:56

Проблемы квантования для 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-битного целого числа для подсчета количества секунд вряд ли будет необходимо ...

43
14.10.2008 14:52:48
Да, но статистически более продуктивно откладывать программистов на биты и байты. Мы говорим о Какао, а не о libc. С другой стороны, на iPhone у вас может быть пункт, в зависимости от приложения.
IlDan 16.07.2009 01:14:16
Непонятно, в чем здесь проблема: мои комментарии относятся непосредственно к Какао, и это важное соображение, когда вы выбираете тип для представления переменной. То, что вы используете Какао, не означает, что вам никогда не придется учитывать факторы, связанные с производительностью приложений ...
mmalc 13.08.2009 14:32:10
Тот факт, что памяти на современных устройствах больше, не является хорошим поводом для потери памяти. Конечно, тратя лишние 32 бита здесь, или есть небольшие изменения, но если это структурное поле или переменная экземпляра, и она выделяется тысячи раз, это становится эффектом никель-и-центов. Неосторожное программирование и непреднамеренное использование 64-битных значений, когда это делает 32-битное, вызывает переполнение памяти - если у вас есть возможность избежать этого, я не могу найти хорошего оправдания, чтобы не захватывать низко висящие фрукты.
Quinn Taylor 20.11.2009 19:04:11

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

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

0
19.04.2012 03:36:19