如果你告诉编译器,你的方法具有格式状的说法,使用 NS_FORMAT_FUNCTION
宏:
- (void)logMessage:(NSString *)format
level:(LoggingLevel)level
withParameters:(va_list)valist NS_FORMAT_FUNCTION(1,0) {
if (level >= self.loggingLevel) {
NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:valist];
}
}
然后
- 在你的方法编译器警告消失,但
- ,如果你打电话给你的方法与格式字符串这是不是一个字符串文字,你会得到一个警告。
例子:
NSString *abc = @"foo %@ bar";
[self logMessage:abc level:7 withParameters:NULL];
warning: format string is not a string literal [-Wformat-nonliteral]
[self logMessage:abc level:7 withParameters:NULL];
^~~
新增:这同样适用于在您的意见中提到的功能。 他们也应该“标记” NS_FORMAT_FUNCTION
:
+ (void)logVeryFineWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2)
{
va_list ap;
va_start(ap, format);
[[self sharedInstance] logMessage:format level:VERY_FINE withParameters:ap];
va_end(ap);
}
+ (void)say:(NSString *)formatstring, ... NS_FORMAT_FUNCTION(1,2)
{
va_list arglist;
va_start(arglist, formatstring);
// This is not needed:
// NSString *litralString = [NSString stringWithFormat:@"%@",formatstring];
NSString *statement = [[NSString alloc] initWithFormat:formatstring arguments:arglist];
va_end(arglist);
[ModalAlert ask:statement withCancel:@"Okay" withButtons:nil];
}
+1比我的回答更好 – trojanfoe
@trojanfoe:谢谢! –
@MartinR是删除了警告,但正如你上面说的,我在\t [[self sharedInstance] logMessage:format level:FINE withParameters:ap]上得到警告; – AAV