iPhone:在生产中抑制NSLog?

时间:2011-10-07 20:58:32

标签: iphone

我的代码中有一堆NSLog语句。无论如何我可以抑制他们在生产中执行,但是在我开发时执行?我不想评论它们,并且在开发时将它们放回去,因为它很麻烦。

4 个答案:

答案 0 :(得分:4)

DEBUG是一个宏,只在您进行项目的调试/开发构建时才定义(默认为xcode)。这将导致在#ifdef DEBUG构建时不包括#endifrelease行之间的任何代码,但它们将被编译并包含在 debug / dev / test < / em> build。

示例:

#ifdef DEBUG
    NSLog(@"Hello World!");
#endif

这是我在Project-Prefix.pch文件中使用的内容(使用DEBUGLOG(@"abc %@", someStr);调用):

#ifdef DEBUG
    extern void DBGQuietLog(NSString *format, ...);
    #define DEBUGLOG(fmt, ...) DBGQuietLog((@"[Line: %d] %s: " fmt), __LINE__, __FUNCTION__, ##__VA_ARGS__);
#else
    #define DEBUGLOG(fmt, ...)
#endif

#ifdef DEBUG
    void DBGQuietLog(NSString *format, ...) {
        if (format == nil) {
            printf("nil\n");
            return;
        }
        va_list argList;
        va_start(argList, format);
        NSString *s = [[NSString alloc] initWithFormat:format arguments:argList];
        printf("%s\n", [[s stringByReplacingOccurrencesOfString:@"%%" withString:@"%%%%"] UTF8String]);
        [s release];
        va_end(argList);
    }
#endif

这会打印控制台行(仅在调试时),行号,类名和方法名称如下:

[Line: 36] -[iPhoneAppDelegate application:didFinishLaunchingWithOptions:]: Hello World!

答案 1 :(得分:2)

您可以创建代理并将其定义为预处理器宏:

#ifdef DEBUG
#define MyLog(str, ...) NSLog(str, ##__VA_ARGS__)
#else
#define MyLog(str, ...) 
#endif

然后你在你的代码中使用MyLog()而不是NSLog(),当不在调试模式下编译时,NSLog将被替换为no-op。

答案 2 :(得分:1)

用宏包裹它们。不幸的是,苹果公司已经没有这样做,使用“罐装”解决方案,但很多人都这样做,网上有很多例子。

类似的东西:

#ifdef DEBUG_MODE
#define DebugLog( s, ... ) NSLog(@"<%@:(%d)> %@", [NSString stringWithUTF8String __PRETTY_FUNCTION__], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DebugLog( s, ... )
#endif

(希望是正确的 - 从另一个屏幕手动复制)

答案 3 :(得分:1)

作为CajunLuke答案的延伸,我只能建议你使用它:http://kdl.nobugware.com/post/2009/03/11/better-nslog/