Objective C преобразует число в NSNumber

Почему это не нравится компилятору, тогда как кастинг должен работать как в c asI читайте здесь Как отличить объект в Objective-C

[p setAge:(NSNumber*)10];

где

- (NSNumber*) age {
    return _age;
}
- (void) setAge: (NSNumber*)input {
    [_age autorelease];
    _age = [input retain];
}

Ответы

Ответ 1

В некоторой симметрии с вашим более ранним вопросом NSNumber - это тип объекта. Вам необходимо создать его с помощью вызова метода, например:

[p setAge:[NSNumber numberWithInt:10]];

Ваш текущий код пытается просто передать произвольное целое число 10 указателю. Никогда делать это: если компилятор не предупредил вас об этом, вы попытались бы получить доступ к некоторым совершенно несоответствующим байтам в ячейке памяти 10, как если бы это был объект NSNumber, который их не было бы. Выполнение этого материала приводит к слезам.

О, и просто для того, чтобы упредить следующие очевидные проблемы, помните, что если вы хотите использовать значение в объекте NSNumber, вам также нужно получить это через вызовы методов, например:

if ( [[p age] intValue] < 18 )
    ...

(NSNumber является неизменным, и я думаю, что он реализован таким образом, что идентичные значения сопоставляются с одним и тем же объектом. Поэтому, вероятно, можно избежать прямых сравнений указателей для равенства значений между объектами NSNumber. Но , пожалуйста, не, потому что это будет нецелесообразно полагаться на детали реализации. Вместо этого используйте isEqual.)

Ответ 2

Сегодня также можно сделать это, используя сокращенную нотацию:

[p setAge:@(10)];

Ответ 3

Используйте это:

[p setAge:[NSNumber numberWithInt:10]];

Вы не можете отличить целочисленный литерал как 10 до NSNumber* (указатель на NSNumber).

Ответ 4

Потому что NSNumber - это объект и "10" в примитивном целочисленном типе, очень похожий на разницу между int и Integer в Java. Поэтому вам нужно вызвать его инициализатор:

[p setAge:[NSNumber numberWithInt:10]

Ответ 5

NSNumber *yourNumber = [NSNumber numberWithInt:your_int_variable];