【iOS】—— 继承者链

2024-07-21 1336阅读

【iOS】—— 继承者链

  • 1.什么是元类
  • 2.根元类NSObject
  • 3. isa走位和继承关系图
    • 3.1 isa走位
    • 3.2 superClass走位
    • 4. class方法
      • 4.1实例对象调用class方法
      • 4.2类对象调用class方法

        1.什么是元类

        对象的isa指针指向类,类也是一种对象被称为类对象,其isa的指向是元类。

        元类是系统给的,定义和编译是由编译器完成的。

        每个类都有独一无二的元类,用来存储类方法。

        可以通过下面的图来解释:

        【iOS】—— 继承者链

        对象 --> 类 --> 元类 --> NSobject,NSObject指向自身。

        2.根元类NSObject

        从上图可以看出,最后的根元类是NSObject,这个NSObject与我们日开开发中所知道的NSObject是同一个吗?

        我们来通过代码验证一下:

        Class class1 = [LGstudent class];
        Class class2 = [LGstudent alloc].class;
        Class class3 = object_getClass([LGstudent alloc]);
        NSLog(@"\n%p-\n%p-\n%p-\n", class1, class2, class3);			
        

        从打印结果如下:

        【iOS】—— 继承者链可以看出打印出来的地址是相同的,说明NSObject只有一份,即NSObject(根元类)在内存中永远只存在一份,由于类的信息在内存中永远只存在一份,所以类对象只有一份。

        3. isa走位和继承关系图

        根据上面的探索以及各种验证,对象、类、元类、根元类的关系如下图所示:

        【iOS】—— 继承者链

        3.1 isa走位

        • 实例对象(Instance of Subclass)的isa指向类(class);
        • 类对象(Class)的isa指向元类(Meta Class);‘
        • 元类(Meta class)的isa指向根元类(Root meta Class);
        • 根元类的isa指向自己本身,形成闭环,这里的根元类就是NSObject;

          3.2 superClass走位

          类之间的继承关系:

          • 类(class)的继承自父类(superClass);
          • 父类(superClass)继承自根类(RootClass),这里的根类是NSObject;
          • 根类继承自nil;

            元类之间的继承关系:

            • 子类的元类(meta subclass)继承自父类的元类(meta superClass);
            • 父类的元类(meta superClass)继承自根元类(Root meta Class);
            • 根元类(Root meta Class)继承自根类(Root Class),这里的根类是NSObject;

              【注意】实例对象之间没有继承关系,类之间有继承关系。

              4. class方法

              class 方法是一种用于获取对象所属类的实例方法。它是NSObject类定义的方法,因此几乎所有的 Objective-C 对象都可以使用class方法。

              使用 class 方法,我们可以获得以下信息:

              1. 类对象:class 方法返回一个指向对象所属类的指针,也称为类对象(class object)。类对象是一个表示类的数据结构,它包含了类的方法、属性以及其他类相关的信息。
              2. 运行时类型识别(Runtime Type Identification,RTTI):通过 class 方法,我们可以在运行时确定对象的实际类型。这对于处理多态情况下的对象非常有用,可以根据对象的实际类型来执行特定的操作。
              3. 继承关系:class 方法在继承关系中起着重要的作用。不论我们使用基类指针还是子类指针引用对象,在通过 class 方法获取对象的类时,都会返回对象所属的实际子类的类对象。这使得我们可以根据对象的类型来执行相应的操作,而不用关心具体的子类。
              4. 元类(Metaclass):类对象本身也是一个对象,它属于元类的实例。元类用于表示类对象的类信息,相当于类对象的类对象。通过 class 方法可以获取类对象的元类,从而可以进一步探索和操作类的信息。

              4.1实例对象调用class方法

              实例调用class方法返回对象所属的类对象,用于获取对象的类信息

              通过下面的代码来展示一下:

              LGstudent* lgstudent = [[LGstudent alloc] init];
              Class objclass = [lgstudent class];
              NSLog(@"Object class: %@", objclass);
              

              运行结果:

              【iOS】—— 继承者链

              使用实例调用 [lgstudent class] 获取对象的类。实际对象类型是LGstudent,因此返回的是 LGstudent类对象。

              4.2类对象调用class方法

              类调用 class 方法返回类的元类(metaclass),用于获取类的信息。

              通过下面的代码来展示一下:

              Class myclass = [student class];
              Class objclass = object_getClass(myclass);
              NSLog(@"\nObject class: %@", objclass);
              

              运行结果:

              【iOS】—— 继承者链

              使用类调用[student class]获student的类对象,并使用object_getClass函数获取类对象的元类。

              类调用class方法返回的是类的元类,而不是类本身的类对象。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]