Просмотрите String Format Specifiers, чтобы узнать, как форматировать инструкции NSLog. Легко лениться с NSLog, потому что объекты имеют встроенный метод -description, который возвращает форматированную строку. Для значений масштабирования вы должны использовать правильный форматтер.
Поскольку точность изменяется по мере перехода от аппаратного обеспечения к оборудованию, лучше привыкнуть использовать преобразования объектов для значений журнала. В этом случае:
NSLog (@ "% @", [[Номер NSNumberFromInt: myObject.myId] stringValue]);
Это будет печатать правильно всегда.
Редактировать # 1: Прошу прощения. Я был лишен сна, когда написал выше. То, что я на самом деле предназначалось, было предостеречь от использования простого int
против NSInteger
, а также для печати с NSNumber numberWithInteger:
.
Рассмотрите следующий запуск на 64-разрядном оборудовании.
int x=pow(2,63);
NSLog(@"x=%d",x); //prints x=2147483647
NSInteger n=pow(2,63);
NSLog(@"n=%d",n); // prints n=-1
NSLog(@"n=%@",[[NSNumber numberWithInteger:n] stringValue]); // prints n=9223372036854775807
В старые дни 8-битных систем, вы столкнулись с проблемами, с проблемами с использованием 8-битного «Int» все время. Для запуска цикла с более чем 256 итерациями требуется long
. С 32-битным int
вы не увидите таких проблем и никогда не будете развивать привычку отслеживать размер ваших int
переменных.
Это может привести к пагубным ошибкам, которые почти невозможно отследить, поскольку они встречаются только с очень конкретными и редкими значениями данных.
Написание для iPhone (или других будущих мобильных телефонов/платформ) означает запись на потенциально высоко изменяющемся оборудовании, как и в старые времена. Лучше всего привыкнуть к раннему использованию привычных определений систем и API.
Edit # 2:
where myId is int, console gives some hight number like 70614496.
(1) Если он печатает различное количество каждый раз, когда вы запускаете, то вы, вероятно, назначая указатель на междунар, когда вы установите его. NSLog правильно печатает значение указателя как int.
(2) Если он печатает одно и то же число каждый раз, у вас, вероятно, есть проблема с переполнением, как в моем первом изменении выше.
В любом случае вам нужно посмотреть код, где вы присваиваете значение свойству id
, а не там, где вы его печатаете.
Если 'myObject.myId' действительно является' int', это должно работать нормально. Первое, что нужно сделать, это дважды проверить это; можете ли вы показать нам интерфейс и/или реализацию любого класса 'myObject' является экземпляром? –
ОК, я обновил код – cocoapriest
Разве это даже компилируется? Попытаться получить переменную экземпляра из объекта класса, я имею в виду. Мой тестовый пример здесь не строился. –