iOS调试 - NSLog

  • NSLog效率低下的原因及尝试lldb断点打印Log

  • 宏定义的黑魔法 - 宏菜鸟起飞手册

  • NSLog 的优化

iOS调试 - NSLog_第1张图片

情况一:优化NSLog

#define NSLog(format, ...) do {                                             \
fprintf(stderr, " %s\n",                                           \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String],  \
__LINE__, __func__);                                                        \
(NSLog)((format), ##__VA_ARGS__);                                           \
fprintf(stderr, "-------\n");                                               \
} while (0)

情况二:release版本中应该要去掉NSLog。

#ifndef __OPTIMIZE__
// 这里执行的是debug模式下 
#define NSLog(...) NSLog(__VA_ARGS__)
#else
//这里执行的是release模式下 
#define NSLog(...) {}
#endif
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif

情况三:一个项目多人开发,每个模块都有Log,屏蔽别人的log显示自己的log。

LXLog.h

#import 

typedef enum _LogOwner
{
    Log_All     =0,
    Log_LW      =1,
    Log_SYX     =2,
    Log_Andrew  =3,
}LogOwner;


#ifndef __OPTIMIZE__
// 这里执行的是debug模式下
#define CTLogBase(owner,onwer_type,fmt,...) if ([[LXLog defaultCTLog].owners containsObject:[NSNumber numberWithInteger:Log_All]] || [[LXLog defaultCTLog].owners containsObject:[NSNumber numberWithInteger:onwer_type]])\
{\
    NSLog((@"[owner: %@] %s [line: %d] " fmt),owner ,__FUNCTION__ ,__LINE__, ##__VA_ARGS__);\
}
#else
// 这里执行的是release模式下
#define CTLogBase(owner,onwer_type,fmt,...)
#endif

// NSLog((@"[文件名:%s]" "[函数名:%s]" "[行号:%d]" format), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define LWLog(fmt,...) CTLogBase(@"LW",Log_LW,fmt,##__VA_ARGS__)
#define SYXLog(fmt,...) CTLogBase(@"SYX",Log_SYX,fmt,##__VA_ARGS__)
#define AZLog(fmt,...) CTLogBase(@"Andrew",Log_Andrew,fmt,##__VA_ARGS__)


/**
 *  调试辅助类
 */
@interface LXLog : NSObject

@property (nonatomic,strong)NSMutableArray *owners;

+(instancetype)defaultCTLog;

/** 只显示该开发者的调试日志 */
-(void)setLogOwner:(LogOwner)owner;

@end

LXLog.m

#import "LXLog.h"

@implementation LXLog

+(instancetype)defaultCTLog
{
    static LXLog *ctlog=nil;
    static dispatch_once_t once_log;
    dispatch_once(&once_log, ^{
        ctlog=[LXLog new];
        [ctlog InitArray];
    });
    return ctlog;
}

-(void)InitArray
{
    _owners = [NSMutableArray array];
    [_owners addObject:[NSNumber numberWithInteger:Log_All]];
}

/** 只显示该开发者的调试日志 */
-(void)setLogOwner:(LogOwner)owner
{
    [_owners removeAllObjects];
    [_owners addObject:[NSNumber numberWithInteger:owner]];
}

@end

调用

    // 启动调试日志
    [LXLog defaultCTLog];
    
    // 只显示该开发者的调试日志
    [[LXLog defaultCTLog] setLogOwner:Log_All];

    LWLog(@"AA");
    SYXLog(@"BB");
    AZLog(@"DD");

你可能感兴趣的:(iOS调试 - NSLog)