当格式说明符错误地传递给方法时如何发出警告
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
查看更多详细信息
假设我有一个 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
查看更多详细信息