在Objective-C中包装对NSLog的调用

在Objective-C中包装对NSLog的调用,objective-c,nslog,variadic-functions,Objective C,Nslog,Variadic Functions,我希望能够在我的类中包装所有对NSLog的调用,这样我就可以在一个地方启用/禁用日志记录 我不知道如何接受可变数量的参数给我的方法,然后将它们交给NSLog 请举例说明。对于记录器,我只使用宏 #if DEBUG #warning LOGGING ENABLED #define DebugLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__) #else #define DebugLog(.

我希望能够在我的类中包装所有对NSLog的调用,这样我就可以在一个地方启用/禁用日志记录

我不知道如何接受可变数量的参数给我的方法,然后将它们交给NSLog


请举例说明。

对于记录器,我只使用宏

#if DEBUG
#warning LOGGING ENABLED
#define DebugLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)

#else
#define DebugLog(...)

#endif
但是 如果要使用变量参数,请执行以下操作:

声明方法,使其接受可变数量的参数

+idstringWithFormat:NSString*格式

使用va_*C函数与变量参数交互

va_开始-初始化va_列表 va_arg-从列表中获取下一个参数。 va_end-通过vas列表释放所有内存 日志的演示

#import <Foundation/Foundation.h>

#define DEBUG 1

#if DEBUG
#warning LOGGING ENABLED
#define DebugLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)

#else
#define DebugLog(...)

#endif

int main(int argc, char *argv[]) {
    @autoreleasepool {
                    id v = @1;
        DebugLog(@"bla: %@", v);        
    }
}

对于记录器,我只使用宏

#if DEBUG
#warning LOGGING ENABLED
#define DebugLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)

#else
#define DebugLog(...)

#endif
但是 如果要使用变量参数,请执行以下操作:

声明方法,使其接受可变数量的参数

+idstringWithFormat:NSString*格式

使用va_*C函数与变量参数交互

va_开始-初始化va_列表 va_arg-从列表中获取下一个参数。 va_end-通过vas列表释放所有内存 日志的演示

#import <Foundation/Foundation.h>

#define DEBUG 1

#if DEBUG
#warning LOGGING ENABLED
#define DebugLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)

#else
#define DebugLog(...)

#endif

int main(int argc, char *argv[]) {
    @autoreleasepool {
                    id v = @1;
        DebugLog(@"bla: %@", v);        
    }
}

我使用一组方便的宏,这些宏来自:

这不需要任何配置,因为调试和发布由Xcode定义为标准。这规定:

DLog在调试时仅发出NSLog ALog在DEBUG中抛出带有消息的断言,并在RELEASE中发出NSLog 如果条件在调试中失败,ZAssert将抛出断言,如果条件在发布中失败,ZAssert将发出NSLog。
日志打印得很好,显示了发出日志的类和方法。

我使用了一组方便的宏,这些宏来自:

这不需要任何配置,因为调试和发布由Xcode定义为标准。这规定:

DLog在调试时仅发出NSLog ALog在DEBUG中抛出带有消息的断言,并在RELEASE中发出NSLog 如果条件在调试中失败,ZAssert将抛出断言,如果条件在发布中失败,ZAssert将发出NSLog。

而且日志打印得很好,显示了发出日志的类和方法。

Erm?但是,如果您想在日志记录中稍微复杂一点,请查看。通常情况下,可以编写一个包含适当启用/禁用逻辑的新宏,并使用该宏代替NSLog。如果你看的话,这里可能有十几个例子,在网上其他地方可能有几百个?但是,如果您想在日志记录中稍微复杂一点,请查看。通常情况下,可以编写一个包含适当启用/禁用逻辑的新宏,并使用该宏代替NSLog。如果你看的话,这里可能有十几个例子,在网上可能有几百个。我成功地做到了这一点,但在发布模式下,我得到了很多未使用的实体对我现在不在日志中使用的各种变量发出警告。我可以关掉它们吗,或者人们不会担心吗?因为调试日志。。。else块中的错误。它需要有do{},而后面是0。请参阅我的答案,了解如何在Release.no中关闭DLog。宏很好。抱歉,abizernI没有说这是完全错误的,只是这一小部分的实现需要do nothing实现来消除编译器警告。我成功地实现了这一点,但在发布模式下,我得到了很多未使用的实体,针对我现在不在日志中使用的各种变量发出警告。我可以关掉它们吗,或者人们不会担心吗?因为调试日志。。。else块中的错误。它需要有do{},而后面是0。请参阅我的答案,了解如何在Release.no中关闭DLog。宏很好。抱歉,abizernI没有说这是完全错误的,只是这一小部分的实现需要do nothing实现来消除编译器警告我的没有错。我在X应用程序中使用它,然后我又测试了一次:Drely?我已经用了大约4年了,你可以从中看到。报复-1?我取消了我的投票;但我真的不喜欢你刚才说“这是不正确的”的评论。。我不想说这不会错,但我看不出任何理由。请说明一下,以防只是说说而已;错误的这是对上面关于消除编译器警告的评论的回复。我并不是说你的整个方法都不正确,只是说可以通过提供一个不做任何事情的实现来消除警告我的没有错。我在X应用程序中使用它,然后我又测试了一次:Drely?我已经用了大约4年了,你可以从中看到。报复-1?我取消了我的投票;但我真的不喜欢你刚才说“这是不正确的”的评论。。我不想说这不会错,但我看不出任何理由。请说明一下,以防只是说说而已;错误的这是对上述评论的回复,abo ut使编译器警告静音。我并不是说您的整个方法都不正确,只是说可以通过提供不做任何事情的实现来消除警告。