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

StackOverflow https://stackoverflow.com/questions/13725

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

64-разрядность на самом деле является смыслом существования NSInteger и NSUInteger;до версии 10.5 таковых не существовало.Эти два параметра просто определяются как значения длины в 64-разрядной версии и как целые числа в 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 есть еще кое-какая информация.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top