Даже если этот вопрос уже был дан ответ, я думал, что конкретизации более длинный ответ для будущих читателей в целом:
Что происходит?
%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);
первым является _pointer_ из 'NSNumber', а не значение, которое он имеет, попробовать, что вместо того, чтобы:' [[NSNumber numberWithInteger: индекс] integerValue] ', и вы получите такое же число в качестве 'index' есть. – holex
BTW - Xcode и компилятор должны дать вам какое-то предупреждение, сообщающее вам, что '% d' не подходит для аргумента' NSNumber'. – rmaddy