2015-04-21 3 views
1

Я делаю карточную игру (вроде), используя SpriteKit. Я создал класс карты, и каждая карта имеет ранг:Правильный способ получения свойства NSInteger из другого класса?

// in Card.h  
@property NSInteger cardRank; 

В одном из моего другого класса (класс Game), я пытаюсь получить это значение. Я создаю экземпляр карты, а также отображать значение в консоли (тестирование цели):

Card *tmpCard = [[Card alloc] init]; 
NSLog(@"%@", tmpCard.cardRank); 

Когда я использую% @ в NSLog, я получаю правильное значение для cardRank, но предупреждение Xcode о том, что " Значения типа nsinteger не должны использоваться в качестве аргументов формата «и что я должен использовать« long ».

Если я бросаю долго ...:

NSLog(@"%ld", (long)tmpCard.cardRank); 

... Я не получил сообщение об ошибке, но не правильное значение для cardRank (он показывает что-то вроде "140378469207968").

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

+0

ли вы назначили его значение по умолчанию? –

+0

«Когда я использую% @ ...» Вы уверены, что используете% @ без сбоев? – gnasher729

+0

@ParthBhatt: Все объекты Objective-C инициализируются нулями. – gnasher729

ответ

2

Получите хорошую книгу о языке C и посмотрите на строки формата. Строки формата в Objective-C точно совпадают, за исключением% @, который ожидает объект.

Правильный способ печати NSInteger и NSUInteger - это% zd (который отлично работает на 32 и 64 бит). В любом случае, если вы включите предупреждения в Xcode (как и должно быть), и если вы включите предупреждения в Xcode (как и должно быть), компилятор скажет вам, где вы ошибаетесь, и даже внесите предложения по его исправлению.

BTW. Если вы используете% @ для печати NSInteger, я ожидаю сбой. Ваше сообщение, похоже, не содержит правды. Когда у вас есть вопросы, сообщите очень, очень точно и правильно, что вы делаете. «Он отображает что-то вроде« 140378469207968 »« бесполезно. Показать точно что он отображает.

+0

«Правильный способ печати NSInteger и NSUInteger - это% zd« Это, конечно, не «правильный» способ печати «NSUInteger», который не имеет знака. – newacct

0

String Format Specifiers on Apple doc.

BTW, NSLog(@"%ld", (long)tmpCard.valeurTop); будет наверняка не покажет вам, «правильное значение для cardRank», как вы просите valeurTop ...

+0

Извините. Это опечатка:/Я исправил вопрос –

0

%d спецификатор формата используется для NSInteger значений типа, но так как IOS поддерживает 32 & 64 бит, бит 64 бит NSInteger имеет тип long, который может быть напечатан с помощью спецификатора формата %ld.

Для справки %@ используется для значений NSString.

Кстати, вы печатаете неправильную переменную, поэтому она печатает значение мусора.

+0

Просмотрите свою документацию для% zd, чтобы избежать всех проблем с 32/64 бит. – gnasher729

+0

Спасибо, что заметили, но это всего лишь опечатка от меня. Исправил вопрос. –

+0

Я указал '% ld', поскольку XCode предлагает то же самое. то есть к типу NSInteger в long. – atulkhatri

2

Log ИНТ с% D

Вход NSInteger с% ZD

Вход NSUInteger с% Tu

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