NSLog效率低下的原因及尝试lldb断点打印Log
宏定义的黑魔法 - 宏菜鸟起飞手册
NSLog 的优化
情况一:优化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");