2013-05-19 2 views
2

Я довольно новичок в объекте-c, и я пытаюсь преобразовать int в NSNumber, чтобы сохранить его в Core-Data.NSNumber возвращает другое значение, чем оригинал int

Я следующий фрагмент кода (индекс является NSInteger)

- (void) associateOrNotToARoutine:(NSString*)exerciseName associate:(BOOL)associate index:(NSInteger)index 

NSLog(@"number w index %d, %d",[NSNumber numberWithInteger:index],index); 

и возвращает

number w index 170413600, 2 

Мне нужен Int из 2 будет переведена на ряд 2 вместе с все остальные цифры должны быть переведены на правильный номер ... Может ли кто-нибудь сказать мне, почему я получаю это преобразование? Я пытался читать дальше NSNumber инструкции, но я не нашел ничего

+1

первым является _pointer_ из 'NSNumber', а не значение, которое он имеет, попробовать, что вместо того, чтобы:' [[NSNumber numberWithInteger: индекс] integerValue] ', и вы получите такое же число в качестве 'index' есть. – holex

+0

BTW - Xcode и компилятор должны дать вам какое-то предупреждение, сообщающее вам, что '% d' не подходит для аргумента' NSNumber'. – rmaddy

ответ

8

Try:

NSLog(@"number w index %@, %d",[NSNumber numberWithInteger:index],index); 
         ^^ 

%@ спецификатор формата будет вызывать [NSNumber description] метод, который должен возвращать значение вы после. Ваш исходный код вернет адрес объекта NSNumber, а не его содержимое.

2

Вы должны использовать,

[[NSNumber numberWithInteger:index] intValue] 

, чтобы получить целое значение, NSNumber, держит

4

Даже если этот вопрос уже был дан ответ, я думал, что конкретизации более длинный ответ для будущих читателей в целом:

Что происходит?
%d является C format string, используемый для указания одного из переданных параметров - целое число (int) значение ivar. Подобно %f используется для значений float.

[NSNumber numberWithInteger:index] возвращает указатель на экземпляр NSNumber. Если вы используете %d, NSLog думает, что вы передаете ему целое число, когда на самом деле вы передаете указатель. Таким образом, выводится значение указателя (адрес памяти).

Что такое %@?
Как указано trojanfoe: %@ сообщает NSLog(), что вы проходили мимо объекта. В этом случае NSLog просит объект описать себя с помощью строки ... он вызывает метод description.

Конкретного ответ
Для этого конкретного вопроса, существует несколько способов. Два основных одно существо:

  • NSLog(@"number w index %@, %d", [NSNumber numberWithInteger:index], index);
  • NSLog(@"number w index %d, %d", [[NSNumber numberWithInteger:index] intValue], index);

Extra благость
При использовании %@, переданный объект может быть все, что отвечает на description, по существу, любой потомок NSObject.Кроме того, если вы создаете свои собственные классы, рекомендуется перегрузить description, чтобы вернуть более значимую строку, чем реализация NSObject по умолчанию.

// Try using it with NSArray or NSDictionary and see how each describe themselves. 
NSLog(@"the array description: %@", myArray); 
NSLog(@"the dictionary description: %@", myDictionary); 
+0

удивительная деталь! – uchuugaka

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