zoukankan      html  css  js  c++  java
  • Objective

    前面讲了一些比较抽象的东西, 类的加载过程以及类别的加载过程, 这次我们来讲讲NSObject自带description方法, 这个方法有两个, 一个是实例方法, 一个是类方法, 下面让我们一起来探究探究吧:


    例子:

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    @property int age;
    @property NSString *name;
    @end
    
    @implementation Person
    @end
    
    int main()
    {
        Person *p = [[Person alloc]init];
        p.age = 10;
        p.name = @"Jack";
    
        NSLog(@"%@", p);
    
        return 0;
    }

    我们都知道, 如果要把一个对象打印出来, 就要用%@, 这样子就可以把一个对象完整的打印出来, 而不需要我们一个一个打印出里面的成员变量, 但这里存在一个问题, 打印出来的结果却是类名+内存地址, 为什么会这样子呢?? 其实这个就是description方法, 我们来讲讲NSLog的运行原理.



    1. 会调用对象p的-description方法.

    2. 拿到-description方法的返回值(NSString *)显示到屏幕上

    3. -description方法默认返回的是"类名+内存地址"


    所以在默认情况下, 利用NSLog%@输出对象时, 结果是<类名: 内存地址>




    但如果我们想输出的结果和我们想的一样, 很简单, 来一个方法重写就OK了~~~


    比如:
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    @property int age;
    @property NSString *name;
    @end
    
    @implementation Person
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"age = %d, name = %@", _age, _name];
    }
    @end
    
    int main()
    {
        Person *p = [[Person alloc]init];
        p.age = 10;
        p.name = @"Jack";
    
        NSLog(@"%@", p);
    
        return 0;
    }

    输出的结果:
    2015-01-24 16:26:31.778 08-description方法[11131:1213423] age = 10, name = Jack
    





    其实类方法也是如此, 原理都是差不多的, 通过重写description类方法, 就可以实现我们所需的效果:
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    @property int age;
    @property NSString *name;
    @end
    
    @implementation Person
    + (void)description
    {
    	return @"ABCDEFG";
    }
    @end
    
    int main()
    {
    	Class c = [Person class];
    	NSLog(@"%@", c);
    
    	return 0;
    }

    结果:
    2015-01-24 17:54:00.071 08-description方法[11333:1242977] ABCDEFG
    





    PS:注意, 在- dsecription方法中, 不要再写NSLog(@"%@", self); 这句代码, 否则会引起死循环.




    好了, 这次我们就讲到这里, 下次我们继续~~~

  • 相关阅读:
    IntelliJ IDEA Java编译打包
    java 播放mp3文件
    cool edit录音声卡
    VB调用VB脚本VBS向Http请求的三种方式
    asp.net 各种下载方式汇总
    Action拦截器接口-- IActionFilter,IExceptionFilter, IResultFilter
    Centos 常用命令
    医院信息集成平台ESB技术框架
    【划重点】医疗软件行业关键概念扫盲
    互联网医院安全架构
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282832.html
Copyright © 2011-2022 走看看