2010-06-13 6 views
22

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

day = day + 1;

ли это смысл? Каковы были бы различия?

ответ

42

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

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

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

+1

Интересный ... кажется важным моментом ... – Moshe

2

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

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

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

Для случая NSNumber, вы вместо этого хотите что-то как:

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

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

Пример кода, который вы опубликовали, будет работать нормально, если day - это NSinteger, он не будет работать вообще, если это NSNumber.

+2

NSInteger и INT не эквивалентны для 64-битных приложений. (NSInteger определяется как длиной для 64-разрядных приложений). Выведенный пример кода также будет работать, если день является экземпляром NSNumber, но приращение не изменит значение, а адрес получателя. Скорее всего, это не то, что хочет OP. –

+0

Для NSObject компилятор не позволит вам выполнять арифметику указателей. – gnasher729

8

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

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

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

Вы можете обернуть NSInteger в качестве NSNumber с помощью:

NSNumber *NumberToStore = @(21); 

и получить его обратно с помощью:

NSInteger retrievingInteger = [NumberToStore integerValue]; 
+0

NSNumber, если вам нужно сохранить номер _as object_. Например, в NSDictionary или NSArray или NSSet. – gnasher729

Смежные вопросы