Разница между int, NSInteger и NSUInteger - PullRequest
36 голосов
/ 02 октября 2011

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

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

Ответы [ 2 ]

29 голосов
/ 02 октября 2011

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

#if __LP64__ || (TARGET_OS_EMBEDDED && !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
20 голосов
/ 02 октября 2011

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

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

Это казалось хорошей идеей в то время, пришедшее из Фортрана, но не очень хорошо устарело.

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

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

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

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

...