【问题标题】:Proper updating of a 32bit method to 64bit support将 32 位方法正确更新为 64 位支持
【发布时间】:2017-06-08 14:57:06
【问题描述】:

我有一个方法正在尝试更新到对我的应用程序的 64 位支持。我有很多这样的warnings

问题在于以下示例。我收到警告:

隐式转换丢失整数精度 NSInteger 到 int

- (int)  aMethod {
    NSUserDefaults *u = [NSUserDefaults standardUserDefaults];
    return [u integerForKey:@"someKey"];
}

如果我将返回类型更改为 NSInteger 我得到

aMethod int 与 NSInteger aka long 实现中的返回类型冲突

-(NSInteger)  aMethod {
    NSUserDefaults *u = [NSUserDefaults standardUserDefaults];
    return [u integerForKey:@"someKey"];
}

我尝试过强制转换返回类型

return (NSInteger)[u integerForKey:@"someKey"];

return (long)[u integerForKey:@"someKey"];

但我无法让错误消失,除非我将其转换为 (int)

return (int)[u integerForKey:@"someKey"];

我已经阅读了很多 SO 问题,但我似乎无法得到一个好的答案。

更新此方法的正确方法是什么?

【问题讨论】:

  • 当你使用-(NSInteger) aMethod {时,你是否也更新了.h文件中的签名? (...或任何其他声明它的地方。)
  • 你是对的。我忘了更新我的 .h 文件 facepalm

标签: ios objective-c


【解决方案1】:

方法:

- (int) aMethod ...

返回int 类型的值。该方法可能首先声明,可能在头文件 (.h) 中,然后在实现 (.m) 文件中定义。

声明:

return [u integerForKey:@"someKey"];

返回调用integerForKey:的结果,这是一个NSInteger类型的值。

NSInteger 不是由 (Objective-)C 语言 定义的类型,而是在 中定义的 类型别名 (typedef) >frameworks 旨在表示平台上的“自然”整数大小。它是 32 位平台上 int 和 64 位平台上 long 的别名。

因此,您的编译器错误告诉您(现在)64 位值被截断以适应 32 位结果。没有一个正确的方法可以解决这个问题,这取决于与 @someKey 关联的值的用途是什么:

  • 如果值现在应该是 64 位,则更改 aMethod 的返回类型;无论是在其单独的声明中(如果有的话),还是在其实施中;到NSInteger。您还需要检查调用该方法的任何位置是否可以接受返回 NSInteger 值,并且您可能需要对变量类型等进行后续更改。您还需要查看与密钥已设置。
  • 如果与键关联的值可能保持为 32 位,那么您可以使用 intForKey: 而不是 integerForKey 并保持返回类型不变。您还应该更改密钥设置的位置以存储int

HTH

更正

NSUserDefaults 上有(不再是?)便捷方法intForKey:。替代方案包括:integerForKey: 和铸造; objectForKey: 获取NSNumber 引用然后intValue;等等

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2014-05-27
    • 2019-04-21
    相关资源
    最近更新 更多