如何在格式说明符错误地传递给方法时发出警告

时间:2015-10-13 10:08:23

标签: ios objective-c methods nslog

假设我有一个返回BOOL的方法,如:

+(BOOL) isNewCar {
    //returns YES or NO
}

然后我在NSLog中使用此方法作为:

NSLog("Is my car new, the answer is %@", [MyUtil isNewCar]);

然后我得到编译器警告:

enter image description here

如果我忽略警告并运行,则应用崩溃。 现在我有另一个名为printCar的方法,它接受变量参数,就像NSLog的实现一样:

 -(void) printCar:(NSString *)msg, ... {
     NSString * contents;
     va_list args;
     va_start(args, msg);
     contents = [[NSString alloc] initWithFormat:msg arguments:args];
     va_end(args);
     [self writeToFile:contents];
}

当我使用上述方法时:

[self printCar:@"The car is mine or not : %@", [MyUtil isNewCar]];

编译器不会生成警告。此外,该应用程序崩溃。

问题:如果NSLog就像{{1}}那样给我们的自定义方法指定了错误的格式说明符,有没有办法生成警告?

提前致谢!

1 个答案:

答案 0 :(得分:3)

是的,你需要NS_FORMAT_FUNCTION宏才能这样做,如果你按下Command然后点击NSLog方法,你也可以看到它

void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2)

所以你的方法

-(void) printCar:(NSString *)msg, ... 

变为

-(void) printCar:(NSString *)msg, ... NS_FORMAT_FUNCTION(1,2)

您还可以点击NS_FORMAT_FUNCTION点击查看有关它的更多详细信息