Board logo

标题: 详解Objective-C的meta-class(4) [打印本页]

作者: look_w    时间: 2019-2-19 17:01     标题: 详解Objective-C的meta-class(4)

实验证明:

为了证实以上的论述,让我们查看下开篇代码中ReportFunction的输出。这个函数的目的就是沿着isa指针进行打印。为了运行ErportFunction,我们需要创建一个实例,并调用report方法。

    id instanceOfNewClass = [[newClass alloc]initWithDomain"some Domain" code:0 userInfo:nil];  
    [instanceOfNewClass performSelector"report)];  
    [instanceOfNewClass release];  

因为我们并没有对report方法进行声明,所以我们使用performSelector进行调用,这样避免编译器警告。
然后ReportFunction函数会沿着isa进行检索,来告诉我们class,meta-class以及meta-class的class是什么样的情况:

【注:ReportFunction使用object_getClass来获取isa指针指向的类,因为isa指针是一个受保护成员,你不能直接访问其他对象的isa指针。ReportFunction没有使用class方法是因为在一个类对象上调用这个方法是无法获得meta-class的,它只是返回这个类而已。(所以[NSString class]只是返回NSString类,而不是NSString的meta-class]
以下是程序的输出:

    This object is 0x10010c810.  
    Class is RuntimeErrorSubclass, and super is NSError.  
    Followingthe isa pointer 1times gives 0x10010c600  
    Followingthe isa pointer 2times gives 0x10010c630  
    Followingthe isa pointer 3times gives 0x7fff71038480  
    Followingthe isa pointer 4times gives 0x7fff71038480  
    NSObject's **class** is 0x7fff710384a8  
    NSObject's meta **class** is 0x7fff71038480  

观察通过isa获得的地址:对象的地址是 0x10010c810.类的地址是 0x10010c600.类的meta-class地址是 0x10010c630.类的meta-class的类地址是 0x7fff71038480.(即NSOjbect的meta-class)NSObject的meta-class的类地址是它自身。这些地址的值并不重要,重要的是它们说明了文中讨论的从类到meta-class到NSObject的meta-class的整个流程。
结论:

meta-class是类对象的类,每个类都有自己单独的meta-class。所有的类对象并不会属于同一个meta-class。meta-class要保证类对象具有继承体系中基类的所有实例和类方法,以及继承体系中的所有中间类方法。对于所有NSObject继承体系下的类,NSObject的实例方法和协议方法对他们和他们meta-class的对象都要有效。所有的meta-class使用基类的meta-class作为自己的基类,对于顶层基类的meta-class也是一样,只是它指向自己而已。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0