【问题标题】:Got 23 warnings overnigth regarding NSUInteger收到 23 条关于 NSUInteger 的警告
【发布时间】:2014-04-01 07:20:02
【问题描述】:

我正在更新我的一个旧项目。我进展顺利,一切顺利。

昨天当我完成工作时,我的项目一切正常,没有错误,没有警告。

突然间,当我今天开始这个项目时,没有按一个键,我一下子收到了 23 个警告。他们都是:

Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int'

有人经历过类似的事情吗?为什么昨天还好好的,今天却一团糟?

编辑。举个例子:

- (IBAction)previousText:(UIBarButtonItem *)sender {


    int i=[self.indexPathArray indexOfObject:[self indexPathForActiveText]];

    if (i>0) {

        [self moveRows:i-1];


    }

}

编辑原来(我不知道为什么)我使用的模拟器是 iPhone Retina(64 位)。我换回 iPhone 3.5 英寸(32 位),所有警告都消失了。

现在的问题是,如何让它兼容两种设备?

【问题讨论】:

  • 在显示警告的地方显示那行代码。
  • 我认为您使用 Xcode 5.1 只需在收到警告的地方添加 (int)。
  • 你的 indexPathForActiveText 返回什么类型?
  • indexPathArray 保存 indexPaths。 [self indexPathForActiveText] 方法返回活动文本字段的索引路径

标签: xcode ios7 compiler-warnings nsuinteger


【解决方案1】:

不要使用像 int/unsigned 这样的原始 C 类型,而是使用像 NSInteger/NSUInteger 这样的 Objective-C 类型。

这些警告将随着类型大小的变化而消失,具体取决于架构。

当您使用类似 printf 的函数时,事情会变得更有趣,因为您需要根据架构有条件地编译格式化字符串;例如:

NSInteger i = 1;
#if __LP64__
NSLog(@"i is %ld", i);
#else
NSLog(@"i is %d", i);
#endif

但是,更好(当格式化语句不平凡时):

NSInteger i = 1;
NSLog(@"i is %ld", (long)i);

【讨论】:

    【解决方案2】:

    64 位警告。

    NSInteger i=[self.indexPathArray indexOfObject:[self indexPathForActiveText]];
    

    您可能更新了您的 xcode。当您针对 iphone 5s 或 ipad air (x86_64) 进行编译时,最新版本打开了很多警告

    【讨论】:

    • 应该可以,但为什么突然发生了?昨天完全没问题
    • 您可能更新了您的 xcode 版本。当您针对 iphone 5s 或 ipad air 进行编译时,它会打开很多警告
    • @Nico 不,这些警告一直存在。 OP 更有可能决定为 arm64 编译(也许通过在设备上而不是模拟器上运行他们的代码)。
    • 原来我选择了 64 位模拟器。昨天是 32 位的。好消息是我现在知道我必须在以后处理这个问题。
    • 当为 NSInteger 更改 int 时,我会在 [self moveRows:i-1];
    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2011-09-16
    相关资源
    最近更新 更多