【问题标题】:Correct way to retrieve a NSInteger property from another class?从另一个类中检索 NSInteger 属性的正确方法?
【发布时间】:2016-01-05 05:00:19
【问题描述】:

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

// in Card.h    
@property NSInteger cardRank;

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

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

当我在 NSLog 中使用 %@ 时,我得到了 cardRank 的正确值,但是 Xcode 警告说“nsinteger 类型的值不应该用作格式参数”并且我应该转换为“long”。

如果我投长... :

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

…我没有收到任何错误,但 cardRank 的值不正确(它显示类似“140378469207968”的内容)。

有人能解释一下为什么我得到这个结果吗?
我可能犯了一个菜鸟的错误,但最近几天我自己无法理解。

【问题讨论】:

  • 你给它分配了默认值吗?
  • "当我使用 %@..." 你确定你使用 %@ 时没有崩溃吗?
  • @ParthBhatt:Objective-C 对象中的所有内容都初始化为零。
  • %@ 没有因整数而崩溃?我觉得很难相信。请仔细检查。当我输入 %@ 时,我的意思是 %@ 而不是您在代码中使用的任何内容。其他人注意到你的帖子写得很粗心。
  • 您好,在您获得帮助后,请不要破坏您的帖子。这就像在树下避难后砍倒一棵树。请允许其他未来的用户从知识中获益。回答者会付出很多努力。不要浪费他们宝贵的时间。

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


【解决方案1】:

找一本关于 C 语言的好书,看看格式字符串。 Objective-C 中的格式字符串完全相同,除了 %@ 需要一个对象。

打印 NSInteger 和 NSUInteger 的正确方法是 %zd(在 32 位和 64 位上都可以正常工作)。不管怎样,如果你在 Xcode 中打开警告(你应该这样做),并且如果你在 Xcode 中把警告变成错误(你应该这样做),编译器会告诉你哪里错了,甚至提出如何修复它的建议。

顺便说一句。如果您使用 %@ 打印 NSInteger,我预计会崩溃。您的帖子似乎没有包含真相。当你有问题时,非常、非常准确和正确地报告你在做什么。 '它显示类似“140378469207968”'是没用的。 准确地显示它所显示的内容。

【讨论】:

  • "打印 NSInteger 和 NSUInteger 的正确方法是 %zd" 这肯定不是打印 NSUInteger 的“正确”方法,它是无符号的。
【解决方案2】:

使用 %d 登录 int

使用 %zd 记录 NSInteger

用 %tu 记录 NSUInteger

【讨论】:

    【解决方案3】:

    你可以找到String Format Specifiers on Apple doc

    顺便说一句,NSLog(@"%ld", (long)tmpCard.valeurTop); 肯定不会在您要求 valeurTop 时向您显示“cardRank 的正确值”...

    【讨论】:

      【解决方案4】:

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

      作为参考,%@ 用于 NSString 值。

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

      【讨论】:

      • 在您的文档中查找 %zd 以避免所有 32/64 位问题。
      • 感谢您的关注,但这只是我的一个错字。更正了问题。
      • 我已经指定了%ld,正如 XCode 所建议的那样。即将 NSInteger 类型转换为 long。
      • @Kapgm cardRank 未初始化,这就是您获得该随机值的原因。只需初始化一次,然后尝试使用%ld 打印
      猜你喜欢
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多