【问题标题】:How to remove 100s of warnings "implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int'" I got after updating to arm64?如何删除更新到 arm64 后收到的 100 条警告“隐式转换失去整数精度:'NSInteger'(又名'long')到'int'”?
【发布时间】:2015-05-14 07:22:23
【问题描述】:

问题:

昨天我将我的一个大型项目转换为支持 arm64,之后我立即收到 500 多个警告。其中大约 70% 是 NSInteger 被分配给 int 的位置,反之亦然,其余的是 NSUInteger 被格式化为 NSString 的位置,如下所示:

NSInteger a = 123;
NSString *str = [NSString stringWithFormat:@"Int:%d", a]; //warning: value of 'NSInteger' should not be used as formate argument; add an explicit cast to 'unsigned long' instead.

现在我确实知道如何手动处理它们,但这是一项艰巨的任务并且非常费力。 我也知道我可以将类型不匹配警告全部静音,但我不想这样做。当然,它们非常有帮助。

我的尝试:

  1. 我已使用 find-n-replace 将 [NSNumber numberWithInt:abc]; 转换为 [NSNumber numberWithInt:(int)abc];。它修复了一些。
  2. 我还尝试将我的所有 int 属性更改为 NSInteger 属性 但它使警告数量增加了一倍(达到 900 多个)。所以我 已恢复。

  3. 我也试过找一些正则表达式但是找不到 适合我需要的东西。

问题:

我正在寻找一个正则表达式或任何其他人尝试过的解决方法,以减少手动修复它们所需的工作量。

提前致谢。

【问题讨论】:

  • 我不认为你会找到你要找的东西。它要么修复每个错误(手动),要么全局静音警告。我没有看到中间立场。
  • Apples 提供了一个 ConvertCocoa64 脚本。详情请看我的回答。

标签: objective-c compiler-warnings nsregularexpression arm64 xcode6.3


【解决方案1】:
NSInteger a = 123;
NSString *str = [NSString stringWithFormat:@"Int:%ld", (long)a];

更新到 64 位后需要像这样((long)a) 进行类型转换。 %d 仅适用于 32 位范围 %ld 用于长整数。为了更好地理解这个苹果文档。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Cocoa64BitGuide/ConvertingExistingApp/ConvertingExistingApp.html

【讨论】:

    【解决方案2】:

    如果其他人面临类似情况,我想澄清如何处理它。尽管@Raju 的回答是建议手动进行(我想避免这样做),但我在他分享的链接中找到了我所需要的。

    Apple 提供了一个名为ConvertCocoa64 的 64 位转换脚本,位于/Developer/Extras/64BitConversion/ConvertCocoa64,它不仅将所有 int 转换为 NSInteger,还处理 float 到 CGFloat 的转换,如上所述:

    它将大多数 int 和 unsigned int 实例转换为 NSInteger 和 NSUInteger,分别。它不会在位域中转换整数 声明和其他不适当的情况。在处理过程中, script 引用硬编码的异常列表。

    除了上述转换之外,它还标记代码中需要手动修复的行。所以这可能有助于字符串格式的警告。

    请参阅this 链接了解完整详情。它不仅解释了如何使用脚本,还提出了一些非常重要的 64 位迁移后检查点。

    【讨论】:

      【解决方案3】:

      objective c 隐式转换将整数精度“NSUInteger”(又名“unsigned long”)丢失为“int”

      更改项目中的键>构建设置“隐式转换为32位类型>调试> *64架构:否”

      其他警告

      更改项目中的键> 构建设置“对 printf/scanf 的类型检查调用:否”

      解释:[它是如何工作的]

      检查对 printf 和 scanf 等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换有意义。

      希望有效果

      [注意:可能会使其他64位架构转换的警告无效]。

      【讨论】:

      • OP 已经声明他不想让警告静音。
      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      相关资源
      最近更新 更多