gpt4 book ai didi

ios - 自定义 NSLog 方法(可变参数)

转载 作者:可可西里 更新时间:2023-11-01 03:35:30 27 4
gpt4 key购买 nike

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

-(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

我哪里错了?

最佳答案

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

-(void)DNSLog:(NSString *)formatString, ...

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

[self DNSLog:@"Hello %d", x];

在编译代码时,您必须有一个全局或实例 debug 变量。如果它是一个 global 那么你可以将 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);

在接口(interface)或头文件中。

HTH.

关于ios - 自定义 NSLog 方法(可变参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16954146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com