美文网首页
OC对象的分类

OC对象的分类

作者: sajiner | 来源:发表于2018-09-27 22:44 被阅读4次

Objective-C对象的分类

Objective-C中的对象也叫OC对象,主要分为三类:
1.实例对象(instance对象)
2.类对象(class对象)
3.元类对象(meta-class对象)

1. 实例对象(instance对象)

  • instance对象:通过类alloc创建出来的对象,每次调用alloc都会创建出新的instance对象。
  • 在内存中的存储信息包括:
    isa指针
    其他成员变量
  • 结构:
struct NSObject_IMPL {
    Class isa;
    NSString *_name;
};

2. 类对象(class对象)

  • 类在内存中有且仅有一个class对象
  • 存储信息包括:
    isa指针
    superclass指针
    属性信息
    成员变量信息
    对象方法
    协议
  • 结构


    类对象的结构.png

3. 元类对象(meta-class对象)

  • 每个类在内存中有且仅有一个meta-class对象
  • meta-class对象和class对象的内存结构一样,但是用途不一样
  • 存储信息包括:
    isa指针
    superclass指针
    类方法
  • 结构:同2

isa指针与superclass指针

isa指针与superclass指针.png

由图可知:

  • isa
    1> instance对象的isa指针指向class对象
    2> class对象的isa指针指向meta-class对象
    3> meta-class对象的isa指针指向基类的meta-class对象
    4> 基类的meta-class对象的isa指针指向自己

  • superclass
    1> class对象的superclass指针指向父类(如果没有父类,superclass指向nil)
    2> meta-class对象的superclass指向父类的meta-class(基类的meta-class对象的superclass指向基类的class对象)

  • instance对象调用对象方法的轨迹
    1> 通过instance对象的isa指针找到class对象,方法不存在,通过superclass找到父类
    2> 直至基类仍找不到方法,就会报unrecognized selector sent to instance XXX错误

  • class对象调用类方法的轨迹
    1> class对象的isa指针找到meta-class对象,方法不存在,通过superclass找到父类
    2> 直至基类的meta-class仍找不到方法,会通过基类的meta-class对象的superclass指针找到基类的class对象,如果方法仍不存在,就会报unrecognized selector sent to class XXX错误

object_getClass()、objc_getClass()、class三者的区别

  • Class object_getClass(id obj)
    1> 传入的obj可能是instance对象、class对象、meta-class对象
    2> 返回值
    a) 如果是instance对象,返回class对象
    b) 如果是class对象,返回meta-class对象
    c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象

  • Class objc_getClass(const char *aClassName)
    1> 传入字符串类名
    2> 返回对应的类对象

  • -(Class)class、+ (Class)class
    1> 返回的就是类对象

相关文章

网友评论

      本文标题:OC对象的分类

      本文链接:https://www.haomeiwen.com/subject/sleyoftx.html