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

Int vs NSNumber vs NSInteger

У меня есть строка кода, которая будет работать по-разному в зависимости от типов данных "день" и "1". Я считаю, что это следующее, хотя позже я проверю свой исходный код.

day = day + 1;

Это имеет смысл? Каковы были бы различия?
4b9b3361

Ответ 1

NSInteger - это определение типа, которое описывает целое число, но оно НЕ эквивалентно int на 64-разрядных платформах.
Вы можете проверить typedef, нажав cmd на NSInteger в Xcode.
NSInteger определяется как int при создании 32-разрядного приложения и long для 64-разрядных приложений.
В большинстве случаев вы можете заменить int на NSInteger, но при этом нужно учитывать некоторые вещи.
Руководство по переходу на 64-разрядное устройство Apple для Cocoa содержит некоторую информацию об этом.

NSNumber - это класс, который поможет вам хранить числовые типы в качестве объекта. Он имеет методы для преобразования между различными типами и методами для получения строкового представления вашего числового значения.
Если вы используете переменную day типа NSNumber*, как вы это делали в своем примере, вы не изменяете значение day, а его адрес памяти.

Если вы работаете со значениями времени, вы также можете взглянуть на NSDate.

Ответ 2

NSInteger является просто целым числом, NSNumber является объектом, где int является примитивным типом данных.

NSInteger - не более чем синоним длинного целого числа.

Если вам нужно где-то сохранить номер, используйте NSNumber. Если вы выполняете вычисления, циклы и т.д., Используйте NSInteger, NSUInteger или int.

Вы можете обернуть NSInteger в NSNumber, используя:

NSNumber *NumberToStore = @(21);

и верните его, используя:

NSInteger retrievingInteger = [NumberToStore integerValue];

Ответ 3

1 является литералом, и компилятор сделает его соответствующим числовым типом, если это необходимо.

Обратите внимание, однако, что в то время как NSInteger и int для большинства целей и целей одно и то же, NSNumber является типом объекта. В этом случае ваш код не имеет смысла (и не должен компилироваться без предупреждений).

(На самом деле, есть некоторые обстоятельства, когда он будет иметь какой-то смысл в терминах арифметики указателя, но это совсем не то, что вы хотите.)

В случае с NSNumber вы хотели бы получить что-то вроде:

day = [NSNumber numberWithInt:[day intValue] + 1];

Ответ 4

NSInteger и int эквивалентны, NSNumber - это объект, используемый для хранения примитивных типов номеров (int, long, float и т.д.).

Код примера, который вы опубликовали, будет отлично работать, если day является NSInteger, он не будет работать вообще, если он NSNumber.