Преимущества использования 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. (Зачем возвращать значение со знаком? Я думаю, что оно должно быть беззнаковым, поскольку у вас не может быть отрицательного числа строк.)

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


person Jordan H    schedule 26.05.2014    source источник
comment
Когда использовать NSInteger против int?   -  person Warif Akhand Rishi    schedule 26.05.2014
comment
@Joey: Ты получил «правильный» ответ? Я не могу найти в ответах, что вы спрашивали.   -  person Chanchal Raj    schedule 01.02.2017


Ответы (4)


Лично я считаю, что 64-разрядность на самом деле является причиной существования NSInteger и NSUInteger; до 10.5 таких не было. Эти два просто определяются как long в 64-битных и как int в 32-битных.

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

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

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

person Irfan    schedule 26.05.2014

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

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

person HelmiB    schedule 26.05.2014
comment
Я думаю, это комментарий, а не ответ. - person Chanchal Raj; 01.02.2017

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

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

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

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

person Arpit Kulsreshtha    schedule 26.05.2014

В продолжение ответа Ирфана: sizeof(NSInteger) равен размеру процессорного слова. Процессору гораздо проще и быстрее работать со словами

person fnc12    schedule 26.05.2014