NSLog 既可以像printf那样方便地格式化输出,同时还能输出时间以及进程ID等信息,可谓调试利器.但是其实NSLog对程序性能也有不小的影响,在执行次数比较少的情况下可能看不出来什么,当短时间大量执行的时候就会对程序执行效率产生可观的影响.
比如UITableView中有一个这样的代理方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"滑动.......");
}
tableView滑动时就会不断地调用此方法,如果在这里有输出信息的话就意味着滑动过程中有相当一部分的内存被占用,甚至会影响tableView滑动时的流畅度.
那么在release环境下就应该尽可能的避免输出操作,让调试时的日志输出只存在于debug环境下.这里用删代码或者注释的方式显然不是很明智.,一般在项目开始的时候就应该对系统提供的NSLog方法进行封装,做到打印行为只出现的debug环境下,而在release环境下不出现.
以下是我对系统的NSLog方法进行的封装:
#ifdef DEBUG
# define DHLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DHLog(...);
#endif
这样用DHLog输出的日志等调试信息就会只存在与debug环境中,而release环境不输出,从而you'hua'l
当你疑惑是什么导致了你的程序运行效率很差的时候不妨注释掉那些NSLog试试,你的问题也许就迎刃而解了