我收到以下代码行的警告:
selectedSegmentIndex
属性NSInteger
的类型为%i
。
如果我将格式更改为Format specifies type 'int' but the argument has type 'long _Nullable'
,我会收到以下警告:
public interface IPrice
{
IEnumerable<Price> GetPrice(string portalShopName);
IEnumerable<Price> GetPrice(DateTime? lastRunDate);
}
Nullable类型是否有新的格式说明符,或者这只是Xcode 7中的一个错误?
答案 0 :(得分:21)
您应该输入:
NSLog(@"selected segment: %li", (long)_segmentControl.selectedSegmentIndex);
因为NSInteger在32位和64位架构中具有不同的长度。以前你没有看到警告,因为可能你只是在编译64位架构。
我还建议您阅读Apple Article,因为Xcode 7中有新的说明符(其中包括nullable
和nonnull
)。
要回答您对评论的疑虑,请参阅此Apple document,其中说明了以下内容:
类型说明符
脚本行动:警告潜在的问题;可能会产生漏报。
通常,在32位代码中,您使用%d说明符来格式化int printf,NSAssert和NSLog等函数中的值 stringWithFormat等方法。但是使用NSInteger,它在64位上 架构的大小与长度相同,需要使用%ld 符。除非你像64位那样构建32位,否则这些 说明符以32位模式生成编译器警告。为了避免这种情况 问题,您可以将值转换为long或unsigned long,如 适当。例如:
NSInteger i = 34; printf("%ld\n", (long)i);
答案 1 :(得分:0)
只想添加: 即使我没有更改长时间发出警告的代码,我也“突然”收到了这个警告,我不明白它为什么出现。
原因:“通用iOS设备”。 当选择设备或模拟器时,警告消失。
仍然,我向NSLog“(long)”添加变量。直到那时我只有“%ld”,无论选择什么(通用设备,真实设备,模拟器)都会发出警告