美文网首页
OC底层04:类的结构

OC底层04:类的结构

作者: ZAREMYDREAM | 来源:发表于2020-09-14 16:00 被阅读0次

之前分析isa指针,今天具体来分析下类的结构。

元类

先创建一个Person类,然后实例化一个对象,然后用LLDB进行分析

@interface Person : NSObject
@end
@implementation Person
@end

//main中
NSObject *obj = [NSObject alloc];
Person *objc1 = [Person alloc];
  1. 先来看objc1的isa,上篇已经讲了第一个为isa指针,以及如何获取其绑定的类。objc1对象的isa指针指向Person类


  2. 当我们读取isa指向的这个Person类的内存信息时,会发现他也有个isa,并且指向不同的地址0x0000000100002170
  3. 继续查看,会发现isa任然指向Person


  4. 很明显,这两个Person的地址时不同,这个第二个Person便是元类。


  5. 继续查看这个Person(元类)的isa,我们会发现他指向NSObject(元类)


  6. 为什么说他是元类而不是NSObject呢,因为它与NSObject不同。


  7. NSObject(元类)的isa指向了它自己,并不会往上指,所以它是根,我们叫根元类


  8. 所以我们最后能找到这样的关系。


    isa流程图.png

    总结:

  • 对象isa指向对象的对应的
  • isa指向对应的元类
  • 元类isa指向根元类
  • 根元类isa指向自己

objc_class & objc_object

要了解类的结构,就要从起源NSObject开始,查看源码可以发现,NSObject类中有一个Class isa OBJC_ISA_AVAILABILITY

@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}

Class是一个结构体指针typedef struct objc_class *Class;
objc_class继承自objc_object

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() const {
        return bits.data();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }
    ……
}

objc_object主要封装一个对象

struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};
  • 大部分对象都是继承objc_object来的,根据objc_class的结构,可以通过地址偏移来查找相关类信息。
    对于一个objec_class,根据内存计算方法
  1. isa8个字节
  2. superclass8个字节
  3. cache16个字节
  4. 要获取 bits需要偏移32个字节

    5.objc_class中提供了一个获取类信息的方法class_rw_t *data() const
  5. 阅读class_rw_t,我们会发现他提供了各种类信息相关的方法
    const method_array_t methods() const {
        auto v = get_ro_or_rwe();
        if (v.is<class_rw_ext_t *>()) {
            return v.get<class_rw_ext_t *>()->methods;
        } else {
            return method_array_t{v.get<const class_ro_t *>()->baseMethods()};
        }
    }

    const property_array_t properties() const {
        auto v = get_ro_or_rwe();
        if (v.is<class_rw_ext_t *>()) {
            return v.get<class_rw_ext_t *>()->properties;
        } else {
            return property_array_t{v.get<const class_ro_t *>()->baseProperties};
        }
    }

    const protocol_array_t protocols() const {
        auto v = get_ro_or_rwe();
        if (v.is<class_rw_ext_t *>()) {
            return v.get<class_rw_ext_t *>()->protocols;
        } else {
            return protocol_array_t{v.get<const class_ro_t *>()->baseProtocols};
        }
    }
  1. 我们给Person类添加相应的信息
@interface Person : NSObject 
@property (nonatomic, copy) NSString *name;
- (void)run;
@end
@implementation Person
- (void)run {
    
};
@end
  1. Person类信息获取

相关文章

  • OC底层04:类的结构

    之前分析isa指针[https://www.jianshu.com/p/bae99f3f5603],今天具体来分析...

  • iOS底层初探

    OC底层实现原理 oc对象以及类的是底层实现 首先,通过数据结构的特性可以猜测类的底层应该是结构体这种数据结构,因...

  • Runtime 二:msg_msgSend执行流程

    在Runtime 一: OC 方法的底层数据结构和存储机制我们知道了OC类的底层结构,类方法的存储位置以及方法缓存...

  • OC底层原理07-类的结构分析

    一、类的本质 在《OC底层原理04-对象的本质》那篇文章中,我们讲到了如何将.m文件编译成.cpp文件查看底层结构...

  • Objective-C 中类的数据结构

    一、类的结构 OC 中的代码在底层实现,使用的是 C、C++,所以要研究 OC 中的类结构,可以将 OC 的代码转...

  • 深入理解Objective-C中类的数据结构

    一、类的结构 OC 中的代码在底层实现,使用的是 C、C++,所以要研究 OC 中的类结构,可以将 OC 的代码转...

  • OC对象的本质

    一、OC对象的底层实现 OC 中的代码在底层实现,使用的是 C、C++,所以要研究 OC 中的类结构,可以将 OC...

  • 二、 字节对齐

    探索OC类的大小要先来说一下结构体,因为OC类底层都是以结构体的形式存在的。 1 结构体大小-字节对齐 我们先定义...

  • OC底层_类结构分析

    类和类结构分析 类的分析 元类 在如下代码中断点调试: 元类是系统给的,其定义和创建都是由编译器完成,在这个过程中...

  • oc对象本质

    OC代码底层实现都是c/c++,oc的类和对象都是基于c/c++的结构体实现的 1.nsobject的底层实现就是...

网友评论

      本文标题:OC底层04:类的结构

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