INT против NSNumber против NSInteger - PullRequest
23 голосов
/ 13 июня 2010

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

day = day + 1;

Имеет ли это смысл? Какими будут различия?

Ответы [ 4 ]

45 голосов
/ 13 июня 2010

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

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

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

9 голосов
/ 11 ноября 2014

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

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

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

Вы можете заключить NSInteger в NSNumber, используя:

NSNumber *NumberToStore = @(21);

и получить его обратноиспользуя:

NSInteger retrievingInteger = [NumberToStore integerValue];
2 голосов
/ 13 июня 2010

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

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

2 голосов
/ 13 июня 2010

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

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

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

Для случая NSNumber вы бы хотели что-то вроде:

day = [NSNumber numberWithInt:[day intValue] + 1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...