在ios iphone编程中使用封装的NSLog来打印调试信息

iOS小技能:NSLog调试技巧 文章地址:https://blog.youkuaiyun.com/z929118967/article/details/125207599 1. DEBUG 宏区分调试模式和发布模式进行特殊处理 2. Objective-C's boxing capability (`装箱`快速构造数字对象) 3. benchmarking的时间测量 立即下载
使用NSLog的一个风险是:它的运行会占用时间和设备资源。

简单而粗暴的解决方案是:在release前,将所有的NSLog注释掉。简单有效,但副作用是:下次你要调试时,又得将NSLog一个个取消注释。


以release模式编译的程序不会用NSLog输出,而以debug模式编译的程序将执行NSLog的全部功能。


解决步骤:

  1. 修改<AppName>-Prefix.pch ,增加以下的宏代码
    [cpp]  view plain copy
    1. #ifdef DEBUG  
    2. # define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);  
    3. #else  
    4. # define DLog(...);  
    5. #endif  
  2. 在程序中使用DLog来替换原来的NSLog
    [cpp]  view plain copy
    1. DLog(@"当前程序目录是:%@", [self applicationDocumentsDirectory ]);  

  3. 修改项目的配置,使得在debug编译的时候,编译DLog的宏,产生详细的日志信息,而release的时候,不产生任何控制台输出
    在Other Linker Flags 中,在debug的时候,加入编译属性 -DEBUG
  4. 这样控制台会显示这样的日志信息
    [cpp]  view plain copy
    1. 2011-12-27 22:23:53.303 IManager[5449:b603] [文件名:/Users/roamer/Project/ÂõΩÊ≥∞ÂêõÂÆâ/Ëꕉ∏öÈÉ®ÁưÁêÜiphone/IManager/IManager/AppDelegate.m]  
    2. [函数名:-[AppDelegate application:didFinishLaunchingWithOptions:]]  
    3. [行号:37]   
    4. 当前程序目录是:/Users/roamer/Library/Application Support/iPhone Simulator/4.3.2/Applications/6B0E7B08-5528-468A-B728-0C4580805368/Documents  

    补充:

      1) __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
      2) __FILE__ 宏在预编译时会替换成当前的源文件名
      3) __LINE__宏在预编译时会替换成当前的行号
      4) __FUNCTION__宏在预编译时会替换成当前的函数名称



在Objective-c开发程序的时候,有专门的日志操作类NSLog,它将指定的输出,输出到(stderr),我们可以利用Xcode的日志输出窗口,那么既然是要记录到具体日志文件,我们就想输出日志写入到具体的日志文件即可。
 
代码
1、  宏定义(下面是我在程序中常用到的日志宏,用DEBUG开关管理,
也就是说只有在DEBUG模式下才让日志输出 :)
 
#ifdef DEBUG 
#  define LOG(fmt, ...) do {                                            / 
        NSString* file = [[NSString alloc] initWithFormat:@"%s", __FILE__]; / 
        NSLog((@"%@(%d) " fmt), [file lastPathComponent], __LINE__, ##__VA_ARGS__); / 
        [file release];                                                 / 
    } while(0) 
#  define LOG_METHOD NSLog(@"%s", __func__) 
#  define LOG_CMETHOD NSLog(@"%@/%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)) 
#  define COUNT(p) NSLog(@"%s(%d): count = %d/n", __func__, __LINE__, [p retainCount]); 
#  define LOG_TRACE(x) do {printf x; putchar('/n'); fflush(stdout);} while (0) 
#else 
#  define LOG(...) 
#  define LOG_METHOD 
#  define LOG_CMETHOD 
#  define COUNT(p) 
#  define LOG_TRACE(x) 
#endif
 
可以看到,除了标准的用户定义输出外,我还加入了许多有用的信息,
比如源程序文件位置,行号,类名,函数名等。具体的应用可以在具体的开发过程中添加、删除。
 
2、  应用:
- (void)redirectNSLogToDocumentFolder{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]]; 
    NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName]; 
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); 
} 
 
- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    // 真机测试时保存日志 
    if ([CDeviceInfo getModelType] != SIMULATOR) { 
        [self redirectNSLogToDocumentFolder]; 
} 
}
 
真机测试的时候,可以利用freopen将标准错误输出保存到指定的文件当中,
这样就可以在问题发生后分析日志文件。
 
3、  设置DEBUG标志是否正确定义
 
Xcode 一般会在 debug 运行配置项里面已经定义号了DEBUG 标志,如果没定义我们就自己写上,以我的 Xcode 4 为例,在项目get Info中找到 PreProcessor Macros 这个属性,对于 Debug 配置我们给他写上 DEBUG,而在 Release 配置中把它留空。 这样我们刚才那段预处理命令就可以根据这个标志来判断我们编译的时调试版本还是发布版本,从而控制 NSLog 的输出。 (因为 Xcode 4 会把 debug/release 两个配置项同时对比展现出来,而 3.x 版本的只能分别设置,如果你用的时xcode 3.x 开发工具, 那么就分别对 Debug/Release 都检查一下)。


在Objective-c开发程序的时候,有专门的日志操作类NSLog,它将指定的输出,输出到(stderr),我们可以利用Xcode的日志输出窗口,那么既然是要记录到具体日志文件,我们就想输出日志写入到具体的日志文件即可。
 
代码
1、  宏定义(下面是我在程序中常用到的日志宏,用DEBUG开关管理,
也就是说只有在DEBUG模式下才让日志输出 :)
 
#ifdef DEBUG 
#  define LOG(fmt, ...) do {                                            / 
        NSString* file = [[NSString alloc] initWithFormat:@"%s", __FILE__]; / 
        NSLog((@"%@(%d) " fmt), [file lastPathComponent], __LINE__, ##__VA_ARGS__); / 
        [file release];                                                 / 
    } while(0) 
#  define LOG_METHOD NSLog(@"%s", __func__) 
#  define LOG_CMETHOD NSLog(@"%@/%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)) 
#  define COUNT(p) NSLog(@"%s(%d): count = %d/n", __func__, __LINE__, [p retainCount]); 
#  define LOG_TRACE(x) do {printf x; putchar('/n'); fflush(stdout);} while (0) 
#else 
#  define LOG(...) 
#  define LOG_METHOD 
#  define LOG_CMETHOD 
#  define COUNT(p) 
#  define LOG_TRACE(x) 
#endif
 
可以看到,除了标准的用户定义输出外,我还加入了许多有用的信息,
比如源程序文件位置,行号,类名,函数名等。具体的应用可以在具体的开发过程中添加、删除。
 
2、  应用:
- (void)redirectNSLogToDocumentFolder{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]]; 
    NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName]; 
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); 
} 
 
- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    // 真机测试时保存日志 
    if ([CDeviceInfo getModelType] != SIMULATOR) { 
        [self redirectNSLogToDocumentFolder]; 
} 
}
 
真机测试的时候,可以利用freopen将标准错误输出保存到指定的文件当中,
这样就可以在问题发生后分析日志文件。
 
3、  设置DEBUG标志是否正确定义
 
Xcode 一般会在 debug 运行配置项里面已经定义号了DEBUG 标志,如果没定义我们就自己写上,以我的 Xcode 4 为例,在项目get Info中找到 PreProcessor Macros 这个属性,对于 Debug 配置我们给他写上 DEBUG,而在 Release 配置中把它留空。 这样我们刚才那段预处理命令就可以根据这个标志来判断我们编译的时调试版本还是发布版本,从而控制 NSLog 的输出。 (因为 Xcode 4 会把 debug/release 两个配置项同时对比展现出来,而 3.x 版本的只能分别设置,如果你用的时xcode 3.x 开发工具, 那么就分别对 Debug/Release 都检查一下)。

GD32F4系列定时器正交译码器实战:用TIMER1读取旋转编码器信号(附完整代码) 本文详细介绍了GD32F4系列定时器正交译码器的实战应用,重点讲解如何使用TIMER1模块高效读取旋转编码器信号。内容涵盖硬件连接、定时器配置、方向判断与速度计算等关键环节,并提供了完整的代码实现和优化建议,帮助开发者快速掌握GD32微控制器在工业控制和消费电子领域的编码器接口设计。 阅读详情

相关推荐

关于MII、RMII、GMII、RGMII、PHY、网络变压器、RJ45的硬件总结

文章目录前言一、网络传输结构及原理1.以太网的工作原理2.TCP/IP协议3.数据链路层(MAC)二、介质独立接口MII,RMII,GMII,RGMII1.MII(Media Independent interface)2.RMII(Reduced Media Independent Interface)3.GMII(Gigabit Medium Independent)4.RGMII(Reduced Gigabit Media Independent Interface)三、物理层芯片(PHY)二、使用步

weixin_44415816的博客 3万+

iOS开发--打印NSRange,CGRect等结构体

使用对应的转换NSStringFromCGPoint   NSStringFromCGSize   NSStringFromCGRect  NSStringFromCGAffineTransform   NSStringFromUIEdgeInsets比如NSLog(@"rect1: %@", NSStringFromCGRect(rect1));...

weixin_34236869的博客 193

ns3-gym入门(二):linear-mesh例子详解

学习ns3-gym中关于IEEE 802.11网状网络中控制随机接入的例子linear-mesh

zoe2222226666的博客 1841

iOS性能优化—NSLog的封装处理

iOS性能优化—NSLog的封装处理。使用NSLog的一个风险是:它的运行会占用时间和设备资源。解决思路是:让debug模式输出log,release模式不输出log,顺带进行输出的格式化。

qq_43441647的博客 704

如何用Python分析20年投资者情绪数据(附ISI和CICSI完整数据集)

本文提供了一份利用Python分析2003-2023年投资者情绪数据的实战指南。文章详细介绍了如何获取并清洗ISI和CICSI数据集,运用Pandas、Matplotlib等工具进行数据探索、可视化与深度分析,包括趋势分解、成分关联及情绪状态划分,旨在帮助读者掌握从数据到洞察的完整流程,为量化金融研究提供方法论支持。

gpu4optimizer的博客 467

sldd数据字典导出为excel

sldd导出为excel

zpfjf的博客 2237

iOS 使用封装的NSLog来打印调试信息

//DLog代替NSLog //debugMethod() 代替 NSLog(@"%s", __func__) //DLog在release下不会输出 #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __L...

weixin_30512043的博客 190

基于Simulink实现电动汽车电机驱动系统的建模与仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 316

ios iphone编程中使用封装的NSLog来打印调试信息

使用NSLog的一个风险是:它的运行会占用时间和设备资源。 简单而粗暴的解决方案是:在release前,将所有的NSLog注释掉。简单有效,但副作用是:下次你要调试时,又得将NSLog一个个取消注释。 以release模式编译的程序不会用NSLog输出,而以debug模式编译的程序将执行NSLog的全部功能。 解决步骤: 修改-Prefix.pch

jmulxg的专栏 858

手把手教你学Simulink--基于Simulink的开关磁阻电机电流斩波控制仿真建模

特点:定子和转子均由普通硅钢片叠压而成,没有永磁体或绕组在转子上。工作原理:利用转子旋转时不同位置的磁阻变化产生转矩。控制挑战:由于SRM的高度非线性和磁饱和效应,需要复杂的控制算法来优化性能。利用Simscape Electrical中的模块构建SRM的物理模型,配置参数如电阻、电感等。matlab深色版本% 添加SRM电机模块根据实际需求调整电机参数。通过上述步骤,我们简要介绍了如何基于Simulink进行开关磁阻电机的电流斩波控制仿真建模。

MHD0815的博客 305

基于机器学习的网络入侵检测系统设计与实现

本文设计并实现了一个基于机器学习的网络入侵检测系统,采用随机森林模型结合KMM算法优化,使用CICIDS2017数据集进行训练。系统包含完整的数据预处理流程、特征工程、模型调优和远程部署方案。实验结果表明,该系统能有效识别多种网络攻击类型,在检测准确率和误报率方面表现优异。研究为网络安全防护提供了新的技术思路和实用工具,具有重要的应用价值。

huanghm88的专栏 315

[ios2]iphone编程中使用封装的NSLog来打印调试信息 【转】

使用NSLog的一个风险是:它的运行会占用时间和设备资源。 简单而粗暴的解决方案是:在release前,将所有的NSLog注释掉。简单有效,但副作用是:下次你要调试时,又得将NSLog一个个取消注释。 以release模式编译的程序不会用NSLog输出,而以debug模式编译的程序将执行NSLog的全部功能。 解决步骤: 修改-Prefix.pch ,增加

jinjiantong的专栏 401

【ROS机器人系统】实验4 ROS简单应用:激光SLAM与导航

ROS简单应用:激光SLAM与导航 (1)了解机器人和SLAM之间关系 (2)了解激光SLAM (3)了解gmapping和导航

南京大学软件工程硕士在读 2145

(暴力调试控的福音)在ios iphone编程中使用封装的NSLog来打印调试信息

转载自:http://blog.youkuaiyun.com/remote_roamer/article/details/7107320 使用NSLog的一个风险是:它的运行会占用时间和设备资源。 简单而粗暴的解决方案是:在release前,将所有的NSLog注释掉。简单有效,但副作用是:下次你要调试时,又得将NSLog一个个取消注释。 以release模式编译的程序不会用NSLog

客亦知夫水与月乎? 1535

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【iOS】iOS崩溃总结

iOS崩溃问题总结:文章系统梳理了iOS开发中常见的崩溃原因,分为内存问题(野指针、内存泄漏、循环引用)、多线程问题(线程安全、死锁、子线程UI操作)、集合类操作(数组越界、字典插入nil)、KVO/KVC错误、UI相关问题(约束冲突、Storyboard错误)等11大类。针对每种问题提供了典型示例和解决方案建议,如使用安全集合库、封装KVO、主线程更新UI等。最后推荐了Xcode Debugger、Crashlytics等调试工具,并强调代码规范的重要性。文章内容全面,对iOS开发者排查和预防崩溃问题具有

ZFJ_张福杰 1863

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

iPhone socket 编程之BSD Socket篇

iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字。iPhone提供了Socket网络编程的接口CFSocket,不过笔者更喜欢使用BSD Socket。 iPhone BSD Socket进行编程所需要的头文件基本都位于/Xcode3.1.4/Platforms/iPhoneOS.platform/De...

weixin_30855761的博客 103

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ios(二):iPhone开发初探

t-c做为native language的开发,Object-c的内核是C语言的,并基于C语言实现OOP的一些特性。Object-c是对C语言的扩展,这和C++的前身Better-c有很大的相似之处,Object-c的新版本里实现了和Java类似的垃圾回收机制,但基于iphone平台的资源限制,iphone平台并不支持垃圾回收机制。   学习一门语言,自然要从"词法分析"也即编译前端和"语法分析"也即编译后端来理解它。   在编译前端,Object-c给我们带

haogangshang的专栏 120

ios开发常用的宏

#define NavigationBar_HEIGHT 44 #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) #def...

weixin_34232363的博客 90
上一篇: UILongPressGestureRecognizer
下一篇: App Store审核指南
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值