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

时间:2015-10-14 09:30:19

标签: objective-c xcode xcode7

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

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中的一个错误?

2 个答案:

答案 0 :(得分:21)

您应该输入:

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

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

我还建议您阅读Apple Article,因为Xcode 7中有新的说明符(其中包括nullablenonnull)。

要回答您对评论的疑虑,请参阅此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”,无论选择什么(通用设备,真实设备,模拟器)都会发出警告