Разница между int, NSInteger и NSUInteger

#iphone #objective-c #int #nsinteger #nsuinteger

#iPhone #objective-c #int #nsinteger #nsuinteger

Вопрос:

В чем основное различие между int NSInteger и NSUInteger в Objective-C?

Какой из них лучше использовать в приложении и почему?

Комментарии:

1. Не существует такой вещи, как NSInt .

2. Смотрите документацию

Ответ №1:

В таких случаях вы можете щелкнуть правой кнопкой мыши и перейти к определению:

 #if __LP64__ || (TARGET_OS_EMBEDDED amp;amp; !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
  

Ответ №2:

Разница заключается в абстрактных типах и их ассоциатах, размер которых зависит от аппаратного обеспечения. Таким образом, теперь нам не нужно беспокоиться о том, какого размера значение int или насколько велик его указатель на каком-либо конкретном оборудовании.

«C» плохо справляется с этим, только указывая, что long по крайней мере такой же большой, как int , что int — это «естественный» целочисленный размер аппаратного обеспечения (что бы это ни значило), что int по крайней мере такой же длины, как short-a (большой беспорядок).

В то время это казалось хорошей идеей, исходящей из Fortran, но не очень хорошо.

Можно было бы использовать определения POSIX, такие как uint32_t, int16_t и т.д. Но это также не учитывает, насколько большим должен быть указатель на каком-либо конкретном оборудовании.

Итак, если Apple определяет возвращаемый тип как NSUInteger, вы просто используете его, и вам не нужно знать, имеет ли он размер 16, 32 или 64 бита для вашего конкретного оборудования. (Я выбрал эти значения из воздуха только для примера).

Как вы можете видеть в @Bastian, фактический размер зависит от аппаратного обеспечения.

Документация отвечает на «букву вопроса», но не дает понимания «почему»?

Комментарии:

1. вы правы. мы получаем только разницу между ними, но почему? я все еще не понимаю, пожалуйста, предложите мне

2. Это стандартизация API. Эти фреймворки поставляются на нескольких архитектурах — хорошо, чтобы API был одинаковым для всех. Имея эти определения типов, Apple абстрагируется от различий платформы от потребителей API. Если вы говорите с API только в терминах этих типов, то (теоретически) вам не нужно думать о различиях платформ при компиляции одного и того же кода для i386, x86_64, ppc, arm7 или чего-либо еще. Это абстракция. Было сказано, что вы должны использовать самый высокий уровень абстракции, который выполняет работу. Поэтому, если у вас нет причин НЕ использовать эти типы, я говорю, используйте их.