Подтвердить что ты не робот

Преимущества использования NSInteger над int?

Я пытаюсь понять, как влияет развитие при разработке как для 32-разрядной, так и для 64-разрядной архитектуры. Из того, что я исследовал до сих пор, я понимаю, что int всегда 4 байта, независимо от архитектуры устройства, на котором запущено приложение. Но NSInteger составляет 4 байта на 32-битном устройстве и 8 байтах на 64-битном устройстве. Я получаю впечатление, что NSInteger является "более безопасным" и рекомендуется, но я не уверен, что это за аргумент.

Мой вопрос: если вы знаете, что возможное значение, которое вы используете, никогда не будет большим (возможно, вы используете его для индексации в массив из 200 элементов или для хранения количества объектов в массиве), почему определить его как NSInteger? Это займет 8 байт, когда вы не будете использовать все это. Лучше ли его определять как int в этих случаях? Если да, то в каком случае вы хотели бы использовать NSInteger (в отличие от int или long и т.д.)? Очевидно, что если вам нужно использовать большие числа, вы можете использовать 64-битную архитектуру. Но если вам нужно было работать и на 32-битных устройствах, вы бы не использовали long long, потому что он тоже 8 байтов на 32-битных устройствах? Я не понимаю, почему можно использовать NSInteger, по крайней мере, при создании приложения, которое выполняется на обеих архитектурах.

Также я не могу придумать метод, который принимает или возвращает примитивный тип - int, и вместо этого использует NSInteger, и мне интересно, есть ли в нем больше, чем просто размер значений. Например, (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section. Я хотел бы понять, почему это так. Предполагая, что у вас есть таблица с 2 147 483 647 строк, что произойдет на 32-битном устройстве, когда вы добавите еще один - обернется ли она до -2,147,483,647? А на 64-битном устройстве это будет 2 147 483 648. (Зачем возвращать знаковое значение? Я думаю, что он должен быть без знака, потому что у вас не может быть отрицательного числа строк.)

В конечном счете, я хотел бы получить лучшее представление о фактическом использовании этих типов данных числа, возможно, некоторые примеры кода были бы замечательными!

4b9b3361

Ответ 1

Я лично считаю, что 64-битная на самом деле причина существования для NSInteger и NSUInteger; до 10,5 таких случаев не существовало. Эти два просто определяются как длинные в 64-битных и как ints в 32-разрядных.

NSInteger/NSUInteger определяются как * dynamic typedef * s для одного из этих типов, и они определяются следующим образом:

#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 имеет дополнительную информацию.

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

Ответ 2

Помню, когда я посещал конференцию разработчиков iOS. вы должны взглянуть на тип данных в iOS7. например, вы используете NSInteger в 64-битном устройстве и сохраняете его в iCloud. то вы хотите синхронизировать с более низким устройством (например, iPad 2-го поколения), ваше приложение не будет вести себя одинаково, потому что оно распознает NSInteger в 4 байтах, а не 8 байтах, тогда ваш расчет будет неправильным.

Но пока я использую NSInteger, потому что в основном мое приложение не использует iCloud или не синхронизируется. и избегать предупреждения компилятора.

Ответ 3

Apple использует int, потому что для переменной управления циклом (которая используется только для управления итерациями цикла) int datatype прекрасен, как в размере типа данных, так и в значениях, которые он может удерживать для вашего цикла. Здесь нет необходимости в зависимом от платформы типе данных. Для переменной управления циклом большую часть времени будет выполнять даже 16-битный int.

Apple использует NSInteger для возвращаемого значения функции или для аргумента функции, поскольку в этом случае тип данных [размер] имеет значение, потому что то, что вы делаете с функцией, - это передача/передача данных с другими программами или с другими фрагментами кода.

Apple использует NSInteger (или NSUInteger) при передаче значения как аргумент функции или возврат значения из функции.

Единственное, что я хотел бы использовать для NSInteger for, - это передавать значения в и из API, который его специфицирует. Кроме того, он не имеет преимущества перед int или долго. По крайней мере, с int или long вы знаете, какие спецификаторы формата использовать в printf или аналогичном выражении.

Ответ 4

Как продолжить Irfan ответ:   SizeOf (NSInteger) равен размеру процессорного слова. Для процессора гораздо проще и быстрее работать со словами