OC对象 学习

2020-02-28  本文已影响0人  Tony17

前言

对象是OC的基本单元,由于OC语言的特殊型,所以OC语言的对象或许会有和其他语言不一样的地方,今天来看看OC对象的内部情况。

OC 对象的本质

OC 对象可以分为 实例对象(Instance)类对象(Class)元类对象(meta-class) 三种。

实例对象(Instance)

  1. OC对象实际为结构体,OC特有的isa指针需要占用8个字节;
  2. 因为编译器内存对齐的情况,所以实际需要使用的内存和系统分配的内存有可能存在不一致的情况。系统分配的内存大小都是16字节的倍数;
  3. 如果存在继承的情况,父类和子类的内存是连续的;
  4. 内存中不保存方法列表等信息;
  5. class_getInstanceSize() 获取到实际使用的大小 和 malloc_size() 获取到系统分配的大小

类对象(Class)

  1. 类对象是唯一的;
  2. 类对象在内存中存储的信息主要是
    • isa 指针
    • superclass 指针
    • 属性信息(@proterty)
    • 对象方法信息(Instance Method)
    • 协议信息(protocol)
    • 成员变量信息(ivar)
    • 类方法信息(Class Method) (null)

元类对象(meta-class)

元类对象指的是描述类对象的对象,通过 object_getClass([NSObject class]) 方式获取

  1. 类对象是唯一的;
  2. 类方法放在元类对象中
  3. 元类对象的结构和类对象的结构是一样的
  4. 类对象在内存中存储的信息主要是
    • isa 指针
    • superclass 指针
    • 属性信息(@proterty) (null)
    • 对象方法信息(Instance Method) (null)
    • 协议信息(protocol) (null)
    • 成员变量信息(ivar) (null)
    • 类方法信息(Class Method)

object_getClass() 传入Instance 返回 Class 、传入Class 返回meta-class

isa 和 superclass 指向关系

isa指向关系
实例对象 -> 类对象 -> 元类对象 -> 基类元类对象 -> 基类元类对象

superclass指向关系
类对象 -> 父类对象 -> ... -> 基类对象 -> nil
元类对象 -> 父类元类对象 -> ... -> 基类元类对象 -> 基类对象

注意: 调用方法的类对象的时候,如果没有是实现,最终会调用到基类的同名实例对象

isa

union isa_t {
    isa_t() { }
        isa_t(uintptr_t value) : bits(value) { }
    
        Class cls;
        uintptr_t bits;
        struct {
            uintptr_t nonpointer        : 1;
            uintptr_t has_assoc         : 1;
            uintptr_t has_cxx_dtor      : 1;
            uintptr_t shiftcls          : 33; // MACH_VM_MAX_ADDRESS 0x1000000000
            uintptr_t magic             : 6;
            uintptr_t weakly_referenced : 1;
            uintptr_t deallocating      : 1;
            uintptr_t has_sidetable_rc  : 1;
            uintptr_t extra_rc          : 19;
        };
}

各个字段解释:

关键字

super

isKindOfClass: 和 isMemberOfClass:

栈空间分配

栈空间地址分配是从高到低的方式来分配的,先创建的局部变量是在高地址位置。

最后

OC对象中最重要的一个元素就是 isa。可以说他是OC对象的灵魂。

以上就是本篇的内容,势必会有一些遗漏和错误的地方,欢迎斧正~

上一篇下一篇

猜你喜欢

热点阅读