IOS自定义NSLOG和断言的使用/description方法的使用原理(对象,数组,字典)
来源:互联网 发布:小鑫优化 编辑:程序博客网 时间:2024/06/06 01:23
举例:
DLog(@"-----%@",@"自己添加的");
[文件名:/Users/lambo/Desktop/‰ª£Á†ÅÈõÜ/ÂÆûÁî®ÊäÄÊúØ/ÂÆûÁî®ÊäÄÊúØ11-ËßÜÈ¢ë/01-Â≠óÂÖ∏ËΩ¨Ê®°Âûã/01-Â≠óÂÖ∏ËΩ¨Ê®°Âûã/ViewController.m]
[函数名:-[ViewController viewDidLoad]]
[行号:36]
-----自己添加的
__FILE__文件名
__FUNCTION__函数名
__LINE__行号
======================
//第一种
#ifdef DEBUG
#define CLog(format, ...) NSLog(format, ## __VA_ARGS__)
#else
#define CLog(format, ...)
#endif
// 第二种 ---相当于把DLOG中的fmt 传入到 NSLog中的##__VA_ARGS__,##__VA_ARGS__吧值赋给fmt;
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...);
#endif
参数解释:
__VA_ARGS__是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
__FILE__宏在预编译时会替换成当前的源文件名
3.__LINE__宏在预编译时会替换成当前的行号
4.__FUNCTION__宏在预编译时会替换成当前的函数名称
有了以上这几个宏,特别是有了__VA_ARGS__,调试信息的输出就变得灵活多了。
#ifdef DEBUG
#define SLog(format, ...) printf("class: <%p %s:(%d) > method: %s \n%s\n", self, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String] )
#else
#define SLog(format, ...)
#endif
开发者没有必要在应用程序的每个版本中都进行断言检查,这是因为大多数项目都是有两个版本:Debug版和Release版。在Debug版中,开发者希望所有的断言都检查到,而在Release版中,往往都是禁用断言检查的。设置Release版本中禁用断言的方法如下:
在Build Settings菜单,找到Preprocessor Macros项,Preprocessor Macros项下面有一个选择,用于程序生成配置:Debug版和Release版。选择 Release项,设置NS_BLOCK_ASSERTIONS,不进行断言检查。如下图所示。
断言 在开发中经常在使用到,先看iOS中断言的使用实例 (NSAssert)
NSString *str = @"abcd";
NSAssert([str isEqualToString:@"abcde"], @"str != abcde");
在断言中前面那部分输入断言条件,后面是断言条件不成立时的输出语句,上述断言的意思就是,如果字符串不等于 abcde 则输出 str != abcde
在debugt条件下程序会收到SIGABRT信号,这时候程序就会abort闪退,但是在release条件下程序能正常运行,但是不建议在正式发布程序中使用断言
关于断言的使用经常会用在判定传入的参数是不是空值,或者其他的一些需要判定的情况下
以上输出实现的具体步骤为:
1.调用对象p的-description方法
2.拿到-description方法的返回值(NSString*)显示到屏幕上
3.-description方法默认返回的是“类名+内存地址”
那么,既然description方法的默认实现是返回类名和对象的内存地址,所以在必要情况下,我们需要重写description方法以达到改变输出结果目的,覆盖description方法的默认实现:
-(NSString *)description{
return 新的字符串;
}
#import "NSArray+desc.h"@implementation NSArray (desc)- (NSString *)descriptionWithLocale:(id)locale{ NSMutableString *strM = [NSMutableString stringWithString:@"(\n"]; [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [strM appendFormat:@"\t%@,\n", obj]; }]; [strM appendString:@")"]; return strM;}@end@implementation NSDictionary (desc)- (NSString *)descriptionWithLocale:(id)locale{ NSMutableString *strM = [NSMutableString stringWithString:@"{\n"]; [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [strM appendFormat:@"\t%@ = %@;\n", key, obj]; }]; [strM appendString:@"}\n"]; return strM;}@end
- IOS自定义NSLOG和断言的使用/description方法的使用原理(对象,数组,字典)
- ios description对NSLog的使用补充
- NSObject的描述(+description)方法和对象的描述(-description)方法,NSLog默认输出的修改(后知后觉)
- IOS NSlog 的使用
- iOS数组和字典的使用----大坑
- iOS description方法的使用介绍
- iOS description方法的使用介绍
- IOS 中 NSLOG 的使用
- iOS通过宏定义设置NSLog打印出类名、方法名和NSLog所在行数以及PCH文件的使用
- OC description方法的使用
- description方法的使用场景
- ios断言的使用(NSAssert)
- iOS断言 NSAssert的使用
- iOS 断言(NSAssert)的使用
- iOS开发之NSLog的使用
- iOS中NSLog的优化使用
- 【代码笔记】iOS-NSLog的使用
- 05-自定义构造方法和description方法(%@带打印一个对象的时候,会调用这个方法)
- 排序算法:插入排序
- 链表的一些题目
- C++一步一步实现二叉搜索树
- android 短信的接收和发送处理
- windows如何配置java和maven?
- IOS自定义NSLOG和断言的使用/description方法的使用原理(对象,数组,字典)
- 算法与数据结构前绪
- 微信/支付宝支付js
- 欢迎使用CSDN-markdown编辑器
- 鸟哥的linux私房菜学习笔记《二十五》账号管理
- 玄学之坑:RecyclerView: No adapter attached; skipping layout
- 新技能 get —— 五笔打字
- 推荐几个精致的web UI框架
- python中try except处理程序异常的三种常用方法