从另一个类检索NSInteger属性的正确方法?

时间:2015-04-21 09:12:29

标签: ios objective-c class sprite-kit nsinteger

我正在使用SpriteKit制作(某种)交易卡游戏。我创建了一个Card类,每张卡都有一个等级:

// in Card.h    
@property NSInteger cardRank;

在我的另一个课程(游戏课程)中,我试图检索此值。我创建一个Card实例,并在控制台中显示该值(测试目的):

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

当我在NSLog中使用%@时,我获得了cardRank的正确值,但是Xcode警告说" nsinteger类型的值不应该用作格式参数& #34;并且我应该选择" long"。

如果我施展得很久......:

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

...我没有错误,但没有正确的cardRank值(它显示类似" 140378469207968")。

有人可以解释我为什么会得到这个结果吗?
我可能犯了一个新手的错误,但在几天内我自己也无法理解。

4 个答案:

答案 0 :(得分:2)

获取一本关于C语言的好书,并查看格式字符串。 Objective-C中的格式字符串完全相同,除了期望对象的%@。

打印NSInteger和NSUInteger的正确方法是%zd(在32位和64位上工作正常)。无论如何,如果您在Xcode中打开警告(如您所愿)并且如果您在Xcode中将警告转换为错误(如您所愿),编译器将告诉您错误的位置,甚至提出如何修复它的建议。

顺便说一句。如果您使用%@打印NSInteger,我预计会崩溃。你的帖子似乎没有包含真相。如果您有疑问,请非常,非常准确地报告您正在做的事情。 '它显示类似“140378469207968”的东西是没用的。完全显示 显示的内容。

答案 1 :(得分:2)

使用%d记录int

使用%zd

记录NSInteger

使用%tu

记录NSUInteger

答案 2 :(得分:0)

您可以找到String Format Specifiers on Apple doc

顺便说一下,NSLog(@"%ld", (long)tmpCard.valeurTop);肯定不会向你展示“cardRank的正确值”,因为你要求valeurTop ......

答案 3 :(得分:0)

%d格式说明符用于NSInteger类型值,但由于iOS支持32& 64位,64位NSInteger属于long类型,可以使用%ld格式说明符打印。

对于引用,%@用于NSString值。

顺便说一句,你正在打印错误的变量,因此它会打印垃圾值。