【iOS】desctiption和debugDescription

一、简介

  与.NET一样,在.NET上得Object对象有个ToString()方法可以用于输出对象的信息,在iOS上的NSObject也有一个方法,为description,该方法返回objc对象的描述信息,当我们调用NSLog打印一个对象或者NSString格式化输出一个对象的时候,就会调用该方法,NSObject还有另一个方法debugDescription,用于在调试控制台输出信息(在控制台输出对象信息如:po person),默认情况下debugDescription调用的时description方法

二、演示

@interface Person : NSObject

@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger gender;
@property (nonatomic, assign) float weight;

@end

@implementation Person
@end

Person

Person *person = [[Person alloc] init];
person.name =@"bomo";
person.age =  24;
person.weight = 134;

NSString *logMessage = [NSString stringWithFormat:@"%@", person];

NSLog(@"stringWithFormat: %@", logMessage);
NSLog(@"nslog: %@", person);

默认情况下,object-c对象只输出对象名字和对象的地址

默认的实现应该是这样的

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p>", NSStringFromClass([self class]), self];
}

通常我们希望看到类的更多属性的信息,我们可以重写description方法

@interface Person : NSObject

@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger gender;
@property (nonatomic, assign) float weight;

@end

@implementation Person

- (NSString *)description
{
    return [NSString stringWithFormat:@"<Person: %p> {\n\tname=%@,\n\tage=%ld,\n\tweight=%f,\n\tgender=%lu\n}", self, self.name, self.age, self.weight, self.gender];
}

@end

输出下面信息

三、封装

  其实我们可以封装一个通用的方法,通过运行时的API动态获取到对象的类型,并输出,这里创建一个基类BaseModel,我们在基类实现一个通用的description方法

@interface BaseModel : NSObject
@end

@implementation BaseModel

- (NSString *)description1
{
    id modelClass = [self class];
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList(modelClass, &outCount);

    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:outCount];

    //遍历出所有的属性key/value
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *propName = [NSString stringWithUTF8String:property_getName(property)];
        id value = [[self valueForKey:propName] description];
        [dict setObject:value forKey:propName];
    }
    return [NSString stringWithFormat:@"<%@: %p> %@", NSStringFromClass([self class]), self, dict];
}

- (NSString *)debugDescription
{
    return [self description];
}

@end

这是我们的Person类只需要继承自BaseModel即可实现如NSDictionary的输出,这里是利用的字典的输出,就不用自己拼字符串

上面通过基类的方式实现的自定义输出,还有另外一种方式也可以达到该目的,通过method swizzling换掉NSObject原来的description方法

  参见:http://www.cnblogs.com/bomo/p/4693363.html

时间: 2024-10-27 16:55:32

【iOS】desctiption和debugDescription的相关文章

IOS description与debugDescription在调试程序中的应用

IOS 中打印函数description与debugDescription的应用 一.description和debugDescription是什么 description和debugDescription是NSObject协议中的声明的两个方法,同时NSObject类也实现了这个方法,如果子类没有重写,则会调用父类的description和debugDescription方法.首先,这两个方法适用于程序代码的调试的,当我们调用打印Log时,会向对象发送一个这样的消息. 我们先来看声明部分的代码

iOS开发之检查更新

iOS开发之检查更新 #pragma mark - 检查更新 - (void)checkUpdateWithAPPID:(NSString *)APPID {     //获取当前应用版本号     NSDictionary *appInfo = [[NSBundle mainBundle] infoDictionary];         NSString *currentVersion = [appInfo objectForKey:@"CFBundleVersion"];    

将.stl文件转化为.dae并动态加载到SceneKit显示(ios中显示3d模型)

ios8之后苹果推出了一个3D模型渲染框架.SceneKit.但是国内针对这方面的教程并不是很多.前两天搞了一下也是一头雾水,终于把最基础的内容搞明白了之后,写下这篇随笔作为cnblogs的开篇,希望能一直写下去. SceneKit现在可以支持有限的几种模型,截止到我写这篇文章为止似乎只有.dae和.abc后一种模型我没有使用过.这篇文章只针对.dae模型写. 首先如果是希望加载一个已有的,不需要程序在运行的时候动态添加的dae模型.那么我们可以直接新建一个game类型的工程.在选项中选择Sce

【IOS学习基础】NSObject.h学习

一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } // 往上翻看到NSObject协议的声明@protocol NSObject/* 中间一大堆方法的声明*/@end 然后我就产生疑问了,为什么我们自己定义的协议是这样,后面加上了<

iOS开发之Xcode常用调试技巧总结

两种最常见最普通的方法: 1.NSLog,最简单的方法,查看变结 中是否有值,有什么值,是不是自己需要的值,然后找到bug. 2.po命令,在程序进入断点处,在控制台中输入po 变量名,也可以像NSLog一样查看变量是否有值,有什么值. 今天主要介绍点高大上的方法. 一.Memory Graph Xcode8新增:Memory Graph解决闭包引用循环问题 这个时候就进入了断点模式,可以查看issue面板,注意选择右边Runtime: 有很多叹号说明就有问题了.看内存中object的名字,有一

iOS编写质量代码

这是一篇读书笔记,快速记录各种高效率编程的技巧和方法.这些方法是为了提升编码质量和效率,高质量代码利于后期的维护和更新,毕竟不能一份代码到永远. 由于是记录形式,当然不能把整篇内容都写下来,只记录关键性的内容,长期更新. 正文 Objective-C使用了消息机制代替调用方法. 区别:使用消息结构的语言,其运行时缩影执行的代码由运行环境来决定.而使用函数调用的语言,则又编译器决定. 头文件中少引用其他文件 在头文件中使用@Class 代替直接引用其他头文件 多使用字面量语法     NSNumb

iOS 高效开发-----实现description 方法 (续)

在 “iOS 高效开发-----实现description 方法”这篇文章的最后,我留下了一个问题,就是,如果要给每个自定义的类覆写description方法和debugDescription方法 ,那将是一件非常庞大的工作量 ,因为自定义的类很多 ,而且每个自定义的类中的属性都会随着需求的修改出现变化 ,那么就又得修改这两个方法,那就变得无穷无尽了,永无宁日了,要么不用,要么就要找到更好得方法去用. 接下来,我们会用到动态运行时runtime. 我们先假设我们要处理的类中的属性都是OC的对象,

ios swift 打造自己的http请求工具

在ios开发中,网络请求是不可以少的,说到网络请求可能用的最多的就是第三方的比人比较有名的AFNetworking.Alamofire等,原生的用的少.今天就用ios提供的原生方法来打造属于自己的一个网络请求工具吧.大神的成长之路,现在就开始起航. 第一步:先建一个类比如叫 Http 如下: //定义请求类型 enum HttpMethod { case GET, POST } //在http中定义类方法来做请求,方便使用 class Http { class func request(meth

ios开发之 NSObject详解

NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力.下面我们就详细的介绍NSObject. 一.使用详解 1.加载及初始化类 /** 运行时加载类或分类调用该方法, 每个类只会调用一次 */ + (void)load { } /** 类实例化使用前需要先初始化, 一个类调用一次, 如果子类没有实现该方法则会调用父类方法