В Cocoa Вы предпочитаете NSInteger или int и почему? - программирование
Подтвердить что ты не робот

В Cocoa Вы предпочитаете NSInteger или int и почему?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

64-бит - это фактически raison d'être для NSInteger и NSUInteger; до 10,5 таких случаев не существовало. Эти два просто определяются как длинные в 64-битных и как ints в 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 имеет дополнительную информацию.

Ответ 4

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

Ответ 5

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

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