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个新符(其中包括nullable和nonnull).
要回答您对评论的疑虑,请参阅此Apple文档,其中说明了以下内容:
类型说明符
脚本行动:警告潜在的问题; 可能会产生漏报.
通常,在32位代码中,您使用%d说明符来格式化printf,NSAssert和NSLog等函数中的int值,以及stringWithFormat:等方法中的int值.但是对于NSInteger,它在64位体系结构上的长度相同,您需要使用%ld说明符.除非您像64位一样构建32位,否则这些说明符会以32位模式生成编译器警告.要避免此问题,可以根据需要将值转换为long或unsigned long.例如:
Run Code Online (Sandbox Code Playgroud)NSInteger i = 34; printf("%ld\n", (long)i);
| 归档时间: |
|
| 查看次数: |
7110 次 |
| 最近记录: |