description

在开发过程中, 往往会有很多的model来装载属性. 而在开发期间经常会进行调试查看model里的属性值是否正确. 那么问题来了, 在objective-c里使用NSLog("%@",model)这行代码打印出来的却是model的地址. 不是我们所想要的结果~! 看图:

那么问题又来了?有没有办法解决这个问题尼,答案那就是有~!只需要重写- (NSString *)description方法即可。如下代码:

.h文件

#import <Foundation/Foundation.h>

@interface TestModel : NSObject
@property (copy,nonatomic) NSString *text;
@property (assign,nonatomic) NSInteger index;
@end

.m文件

#import "TestModel.h"

@implementation TestModel
- (NSString *)description {
return [NSString stringWithFormat:@"text:%@--index:%zi",self.text,self.index];
}
@end

然后这时候在使用NSLog("%@",model)这行代码就能打印我们想要的结果了。 看如下图:

那么问题继续来了...
如果model里有N多个属性尼, 可能10个, 可能20个... 难道要在description方法里一个一个写属性并拼接返回? 你不嫌麻烦, 我光看着都蛋疼了... 所以我们可以采用runtime技术来动态获取属性并返回. 如下修改后的.m文件代码:

修改后的.m文件

#import "TestModel.h"
#import <objc/runtime.h>//导入runtime头文件 @implementation TestModel
- (NSString *)description {
//初始化一个字典
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; //得到当前class的所有属性
uint count;
objc_property_t *properties = class_copyPropertyList([self class], &count); //循环并用KVC得到每个属性的值
for (int i = 0; i<count; i++) {
objc_property_t property = properties[i];
NSString *name = @(property_getName(property));
id value = [self valueForKey:name]?:@"nil";//默认值为nil字符串
[dictionary setObject:value forKey:name];//装载到字典里
} //释放
free(properties); //return
return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary];
}
@end

然后在打印model, 如下图:

这里写图片描述

debugDescription

现在问题继续来了..
在项目中NSLog语句往往也很多. 如果重写description方法. 在控制台则会打印出很多属性. 看着就不舒服~~而且还有一个问题就是, 有时候我们其实并不需要打印model的属性.. 那这样重写description方法反而适得其反了! 所有, 现在有一个解决方案就是重写debugDescription方法


什么是debugDescription? 其实debugDescriptiondescription是一样的效果. 只不过唯一的区别就是debugDescription是在Xcode控制台里使用po命令的时候调用的~!


debugDescription的实现其实也就是调用了description方法而已

so, 在开发过程中并且model调试的时候, 笔者推荐重写debugDescription方法而不是重写description方法. 当需要打印model的属性的时候, 在控制台里使用po命令即可. 如下在此修改后的.m文件

#import "TestModel.h"
#import <objc/runtime.h>//导入runtime头文件 @implementation TestModel // 重写debugDescription, 而不是description
- (NSString *)debugDescription {
//声明一个字典
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; //得到当前class的所有属性
uint count;
objc_property_t *properties = class_copyPropertyList([self class], &count); //循环并用KVC得到每个属性的值
for (int i = 0; i<count; i++) {
objc_property_t property = properties[i];
NSString *name = @(property_getName(property));
id value = [self valueForKey:name]?:@"nil";//默认值为nil字符串
[dictionary setObject:value forKey:name];//装载到字典里
} //释放
free(properties); //return
return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary];
}
@end

看如下图, 分别使用了NSLogpo命令的打印


这里写图片描述

结果:

这里写图片描述

这就达到了我们想要的效果, 如果需要打印model的属性, 打个断点然后使用po命令即可

Description &&debugDescription && runtime(debug模式下调试model)的更多相关文章

  1. C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call问题。

    今天遇到一个Access Violation的crash,只看crash call stack没有找到更多的线索,于是在debug模式下又跑了一遍,遇到了如下的一个debug的错误提示框: 这个是什么 ...

  2. Debug模式下编译溢出问题

    问题: 代码在Debug模式下编译报出内存溢出的错误,而Release模式下则没有. 由于Debug模式下包含调试信息,并且不作任何优化.而Release模式进行了各种优化,内存检测等操作均省去,使得 ...

  3. VS2005--设置Release模式下调试

    今天初略看了下,所谓Release和Debug只是大家和编译器约定的一些生成规则而已,所以调试是无所谓Release和Debug的,只是由于生成的规则不同,可能Release的一些调试结果没Debug ...

  4. Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录

    项目无法启动了 简单的介绍一下事件过程:周一的早上,收到前端同事抛过来的一个任务,说是一个接口无法正常返回数据,于是就让他把参数发过来,我想试着在本地重现一下并且将问题修复掉,这种情况肯定是要通过de ...

  5. jdk动态代理在idea的debug模式下不断刷新tostring方法

    在jdk的动态代理下,在使用idea进入动态代理的debug模式下,单步调试会刷新idea的tostring方法,让他自己重走了一遍代理 这个问题暂时无解

  6. Django -&gt; debug模式下的静态文件服务(/media/)

    正式公布django项目的时候,假设存在静态文件(通常会统一放在名称为media或static的文件夹下),则须要建立url到文件系统的映射,比如.使用nginx的时候我们须要进行这种配置. # Dj ...

  7. idea 项目在一般模式下可以正常启动,在debug模式下无法启动,像是卡住了的感觉

    项目一般模式下可以启动,debug模式下就是启动不了,后经过排查发现打的有断点,断点取消在重启立马就可以啦. Method breakpoints may dramatically slow down ...

  8. 重写NSLog,Debug模式下打印日志和当前行数

    在pch文件中加入以下命令,NSLog在真机测试中就不会打印了 //重写NSLog,Debug模式下打印日志和当前行数 #if DEBUG #define NSLog(FORMAT, ...) fpr ...

  9. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

随机推荐

  1. win7 python2.7安装PIL库

    一.前言 遇到客户给了一个需求,需要拼接多个图片,上网找到一个解决方式,不过是需要安装PIL的,相信安装过这个库的应该都遇到很多问题,接下来说说怎么解决. 我的环境是: 操作系统:win10 64bi ...

  2. 探究算子find_shape_model中参数MaxOverlap的准确意思

    基于形状的模板查找算子: find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxO ...

  3. Condition Variable使用及其Thread Cancellation线程取消

    条件变量Condition Variable的一般用法: 唤醒用法: struct { pthread_mutex_t mutex; pthread_cond_t cond; //whatever v ...

  4. UX设计案例研究:建立更好的用户体验(重新设计Air Peace Airline网站)

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 坐飞机旅行总是能给人带来很棒的体验,但我认为应该考虑预订航班时给用户带来的压力.在如今的数字世界,我 ...

  5. ps 中添加一张图片

    // 测试打开一个文件var fileref = new File ("/E/work/没有图片提交/2014/2014.5.19/G20/部件渲染测试/png/tianji_1-41001 ...

  6. Flash的不同位宽与CPU地址线的接线问题?

    一般Flash都有8.16.32等这些不同的位宽,当然说白了就是Flash的数据线位数. 在Flash与CPU的地址线的连接问题时:不同位宽的有不同的连接方法: 一般是:位宽为8时CPU的ADDR0与 ...

  7. java程序无法启动:Unsupported major.minor version 51.0

    今天在sae上部署了一个项目,结果总是出现503错误:service unavailable,然后jvm出现了一大串错误日志,如下 JAVA_SAE_Fatal_error: Failed start ...

  8. ORACLE EBS中查看系统已经打过的补丁

    SELECT COUNT (BUG_NUMBER)  FROM AD_BUGS WHERE BUG_NUMBER LIKE '%7303031%'  --对应 patch号 ; --TABLESAD_ ...

  9. Delphi 文件拷贝

    function DoCopyDir(sDirName:String;sToDirName:String):Boolean;var hFindFile:Cardinal; t,tfile:String ...

  10. Git Note - git tag

    git tag is used to create labels, usually for version numbers. Format: git tag <TagName> <r ...