首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义NSLog方法(变量)

自定义NSLog方法(变量)
EN

Stack Overflow用户
提问于 2013-06-06 13:16:53
回答 3查看 7.2K关注 0票数 6

我正在尝试创建一个自定义的调试方法DNSLog(),它仅在NSLog变量为true时执行调试。

代码语言:javascript
运行
复制
-(void)DNSLog:(NSString *)formatString, ...
{
    if(debug){
        va_list args;
        va_start(args, formatString);
        NSLog([[NSString alloc] initWithFormat:formatString arguments:args]);
        va_end(args);
    }
}

但是当我尝试使用以下命令调用它时

代码语言:javascript
运行
复制
DNSLog(@"Hello %d",x);

我收到一个编译错误:

代码语言:javascript
运行
复制
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

我哪里错了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-06 14:19:46

你混淆了方法和函数-- Objective-C两者都有。NSLog是一个标准函数,因此您可以将其作为NSLog(...)调用。您已经定义了一个方法:

代码语言:javascript
运行
复制
-(void)DNSLog:(NSString *)formatString, ...

但试图将其作为函数调用。要调用您的方法,您需要执行以下操作:

代码语言:javascript
运行
复制
[self DNSLog:@"Hello %d", x];

在编译代码时,必须有一个全局或实例debug变量。如果它是一个全局变量,那么您可以将DNSLog定义为一个函数(如果debug是一个实例变量,这将不起作用,因为只有方法可以直接访问这些变量)。该函数将启动:

代码语言:javascript
运行
复制
 void DNSLog(NSString *formatString, ...)

函数的主体将与方法的主体相同。

NSLog还有一个属性NS_FORMAT_FUNCTION,它告诉编译器它接受格式字符串作为参数,编译器会检查格式字符串和参数是否匹配。要为您的方法或函数执行此操作,请编写:

代码语言:javascript
运行
复制
-(void)DNSLog:(NSString *)formatString, ... NS_FORMAT_FUNCTION(1,2);

或者:

代码语言:javascript
运行
复制
void DNSLog(NSString *formatString, ...)  NS_FORMAT_FUNCTION(1,2);

在接口或头文件中。

HTH。

票数 14
EN

Stack Overflow用户

发布于 2013-06-06 13:39:51

尝试将此宏添加到您的应用程序中,可能是在.pch文件中,而不是使用自定义方法。

代码语言:javascript
运行
复制
#ifdef DEBUG
#define MyLog(x, ...) NSLog(@"%s %d: " x, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define MyLog(x, ...)
#endif

这将运行一个自定义日志,我在调试模式下调用MyLog,而在发布模式下,它不会执行任何操作。它还打印出一些其他有用的信息,如日志的文件号和行号。

票数 13
EN

Stack Overflow用户

发布于 2013-06-06 14:12:15

感谢大家对初学者的非常“有价值”、“鼓舞人心”和“支持”的回答。

我发现了我的错误,下面是修正后的工作代码:

代码语言:javascript
运行
复制
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方法

代码语言:javascript
运行
复制
-(void)DNSLog:(NSString *)formatString, ...

我正尝试使用C函数调用它。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16954146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档