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); 这句代码, 否则会引起死循环.




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

  • 相关阅读:
    poj3032
    poj2603
    poj2019
    poj2369
    AVI 录像功能压缩算法设置
    陆其明的新书《脚本驱动的应用软件开发方法与实践》
    c# 动态编译
    !!!分享:把bmp格式的图片转化为AVI格式的视频操作的封装类其中对于AVI API的函数的使用较为完整
    视频文件格式和视频编码方式
    activex 控件的id 定义位置+使用ocx控件的客户端程序中对控件定义的文件中控件id定义的位置
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282832.html
Copyright © 2011-2022 走看看