码迷,mamicode.com
首页 > 移动开发 > 详细

iOS NSObject 的 isa 属性的类型 Class

时间:2016-05-10 18:40:28      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

以前对NSObject的isa属性也知道点,但是了解不深,今天看了这篇博文,感觉很好,总结一下:

http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and-class-and-meta-class/

先把里面最重要的图贴上:

技术分享

我们在看看几个重要的定义:

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;

 

这里另外提一下:其实id不是NSObject * ,而是 struct objc_object *,那么为什么id能够指向任意的NSObject对象呢?因为objc_object只有一个Class类型的 isa变量,而这个结构,恰恰和NSObject的定义一致:

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}

这样,NSObject对象的首地址处的内容,就能用id指向了。因为本质上,对象的数据都是由struct存放的。


 

看看定义:

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

虽然这个不是新版本的定义,但是基本理念一样。objc_class 结构体中,也有指向objc_class 结构体的2个指针,isa 和 super。

我们调用每个普通对象的 class 方法,都会返回这个类对应的objc_class结构体的指针。同一个类的对象,调用class方法,都返回指向同一个objc_class结构体的指针。

图中的Meta Class的作用始终不理解,为什么需要它?有什么实际的应用吗?

 

iOS NSObject 的 isa 属性的类型 Class

标签:

原文地址:http://www.cnblogs.com/breezemist/p/5478634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!