#iphone #objective-c #int #nsinteger #nsuinteger
#iPhone #objective-c #int #nsinteger #nsuinteger
Вопрос:
В чем основное различие между int
NSInteger
и NSUInteger
в Objective-C?
Какой из них лучше использовать в приложении и почему?
Комментарии:
1. Не существует такой вещи, как
NSInt
.
Ответ №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 или чего-либо еще. Это абстракция. Было сказано, что вы должны использовать самый высокий уровень абстракции, который выполняет работу. Поэтому, если у вас нет причин НЕ использовать эти типы, я говорю, используйте их.