Xcode警告:Format指定类型为'long'但参数的类型为'int _Nullable'

bbj*_*jay 3 xcode objective-c xcode7

我收到以下代码行的警告:

    NSLog(@"selected segment: %li", _segmentControl.selectedSegmentIndex);
Run Code Online (Sandbox Code Playgroud)

该属性selectedSegmentIndex是类型NSInteger.

如果我将格式更改为%ii,请收到以下警告:

Format specifies type 'int' but the argument has type 'long _Nullable'
Run Code Online (Sandbox Code Playgroud)

Nullable类型是否有任何新的格式说明符,或者这只是Xcode 7中的一个错误?

Viv*_*ive 22

你应该输入:

NSLog(@"selected segment: %li", (long)_segmentControl.selectedSegmentIndex);
Run Code Online (Sandbox Code Playgroud)

因为NSInteger在32位和64位架构中具有不同的长度.以前您没有看到警告,因为可能您只是针对64位架构进行编译.


我还建议阅读苹果的文章,因为有在Xcode 7个新符(其中包括nullablenonnull).


要回答您对评论的疑虑,请参阅此Apple文档,其中说明了以下内容:

类型说明符

脚本行动:警告潜在的问题; 可能会产生漏报.

通常,在32位代码中,您使用%d说明符来格式化printf,NSAssert和NSLog等函数中的int值,以及stringWithFormat:等方法中的int值.但是对于NSInteger,它在64位体系结构上的长度相同,您需要使用%ld说明符.除非您像64位一样构建32位,否则这些说明符会以32位模式生成编译器警告.要避免此问题,可以根据需要将值转换为long或unsigned long.例如:

NSInteger i = 34;
printf("%ld\n", (long)i);
Run Code Online (Sandbox Code Playgroud)