我正在更新我的旧项目。我做得很好,一切顺利。
昨天当我完成工作时,我的项目一切正常,没有错误,没有警告。
突然间,今天我开始这个项目而没有按一个键,我立刻得到了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视网膜(64位)。我改回iPhone 3.5英寸(32位)并且所有警告都消失了。
现在问题是,如何让它兼容两种设备?
答案 0 :(得分:2)
64位警告。
NSInteger i=[self.indexPathArray indexOfObject:[self indexPathForActiveText]];
你可能已经更新了你的xcode。当您编译iphone 5s或ipad air(x86_64)时,最新的警告会发出很多警告
答案 1 :(得分:2)
不要使用像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);