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

How to give a warning when format specifiers are passed wrongly to a method

假设我有一个 returns BOOL 像这样的方法:

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

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

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

然后我收到编译器警告:

如果我忽略警告并运行,应用程序崩溃。 现在我有另一个名为 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 那样向我们的自定义方法提供了错误的格式说明符,是否有办法生成警告??

提前致谢!

是的,您需要 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查看更多详细信息