我正在尝试创建一个自定义的调试方法DNSLog()
,它仅在NSLog
变量为true时执行调试。
-(void)DNSLog:(NSString *)formatString, ...
{
if(debug){
va_list args;
va_start(args, formatString);
NSLog([[NSString alloc] initWithFormat:formatString arguments:args]);
va_end(args);
}
}
但是当我尝试使用以下命令调用它时
DNSLog(@"Hello %d",x);
我收到一个编译错误:
Undefined symbols for architecture i386:
"_DZNSLog", referenced from:
-[RestaurantInfoViewController viewDidLoad] in RestaurantInfoViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我已经使用了这个作为参考:http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
我哪里错了?
发布于 2013-06-06 14:19:46
你混淆了方法和函数-- Objective-C两者都有。NSLog
是一个标准函数,因此您可以将其作为NSLog(...)
调用。您已经定义了一个方法:
-(void)DNSLog:(NSString *)formatString, ...
但试图将其作为函数调用。要调用您的方法,您需要执行以下操作:
[self DNSLog:@"Hello %d", x];
在编译代码时,必须有一个全局或实例debug
变量。如果它是一个全局变量,那么您可以将DNSLog
定义为一个函数(如果debug
是一个实例变量,这将不起作用,因为只有方法可以直接访问这些变量)。该函数将启动:
void DNSLog(NSString *formatString, ...)
函数的主体将与方法的主体相同。
NSLog
还有一个属性NS_FORMAT_FUNCTION
,它告诉编译器它接受格式字符串作为参数,编译器会检查格式字符串和参数是否匹配。要为您的方法或函数执行此操作,请编写:
-(void)DNSLog:(NSString *)formatString, ... NS_FORMAT_FUNCTION(1,2);
或者:
void DNSLog(NSString *formatString, ...) NS_FORMAT_FUNCTION(1,2);
在接口或头文件中。
HTH。
发布于 2013-06-06 13:39:51
尝试将此宏添加到您的应用程序中,可能是在.pch文件中,而不是使用自定义方法。
#ifdef DEBUG
#define MyLog(x, ...) NSLog(@"%s %d: " x, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define MyLog(x, ...)
#endif
这将运行一个自定义日志,我在调试模式下调用MyLog,而在发布模式下,它不会执行任何操作。它还打印出一些其他有用的信息,如日志的文件号和行号。
发布于 2013-06-06 14:12:15
感谢大家对初学者的非常“有价值”、“鼓舞人心”和“支持”的回答。
我发现了我的错误,下面是修正后的工作代码:
void ZNSLog(NSString *format, ...){
if(!ENABLE_DEBUGGING)
return;
va_list args;
va_start(args, format);
NSLogv(format, args);
va_end(args);
}
ZNSLog(@"Hello");
我之前使用的方法是Objective C方法
-(void)DNSLog:(NSString *)formatString, ...
我正尝试使用C函数调用它。
https://stackoverflow.com/questions/16954146
复制相似问题