2015-10-14 73 views
3

我得到这样的警告以下行的代码:的Xcode警告:格式指定型“长”但参数的类型为“INT _Nullable”

NSLog(@"selected segment: %li", _segmentControl.selectedSegmentIndex); 

酒店selectedSegmentIndexNSInteger类型。

如果我改变格式%i我得到以下警告:

Format specifies type 'int' but the argument has type 'long _Nullable' 

是否有可空类型的任何新的格式说明或者这只是一个错误在Xcode 7?

回答

18

你应该输入:

NSLog(@"selected segment: %li", (long)_segmentControl.selectedSegmentIndex); 

由于NSInteger的具有在32和64位架构不同的长度。以前你没有看到警告,因为可能你只是针对64位体系结构进行编译。


我还建议阅读Apple Article,因为有在Xcode 7个新符(除其他nullablenonnull)。


要从评论回答您的疑问,请参阅本Apple document,他们声明如下:

类型说明符

脚本动作:警告潜在的问题;可能会产生误报。

通常,在32位代码中,您可以使用%d说明符在函数(如printf,NSAssert和NSLog)中以及在诸如stringWithFormat之类的函数中格式化int 值。但是使用NSInteger,64位的 体系结构的大小与长度相同,因此需要使用%ld 说明符。除非您构建的是32位类似的64位,否则这些 说明符会在32位模式下生成编译器警告。为了避免这个问题,你可以将这些值转换为long或unsigned long,因为 是合适的。例如:

NSInteger i = 34; 
printf("%ld\n", (long)i); 
+0

那么这会使警告消失,但iOS在64位上已经有一段时间了,而我不记得必须在NSLog中输入参数。过去,将格式说明符从%i更改为%li就足够了。 – bbjay

+1

@bbjay请修改我更新的答案,我在这里粘贴了苹果公司的代码片段。他们也这样做。警告总是在那里。你可能编译的主要是64位,所以你没有看到这个警告。如果你已经编译过32位,你以前就会看到它。唯一的区别是,在Xcode 7中,警告始终可见,不依赖于目标架构。 – Vive

+0

确实。原因是架构的构建设置默认为'ARCHS =“$(ARCHS_STANDARD)”;'Xcode 7中的值为'armv7,arm64'。你能在你的答案中包含这些信息吗?那么我会很乐意接受它。 – bbjay

0

只想补充: 我得到这个警告“突然”即使我没有改变做了很长一段时间警告的代码,我不明白为什么它的出现。

原因:“通用iOS设备”。当选择设备或模拟器时,警告消失。

还是,我在NSLog中添加了“(long)”这个变量。直到那时我只有“%ld”,无论选择什么东西(通用设备,真实设备,模拟器),都会发出警告

相关问题