【iOS开发】理解OC的类,父类,元类的关系

这篇具有很好参考价值的文章主要介绍了【iOS开发】理解OC的类,父类,元类的关系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在OC中,有对象objc,有类Class,有父类SuperClass,其实还有一种元类MetaClass。在接下来的RunLoop,消息转发机制的学习之前需要知道OC类和对象的底层,所以理解类, 父类,元类的关系是基础

1.1 类和对象的关系

在 Objective-C 中,类是对象的模板或蓝图,而对象则是类的实例。每个对象都有一个类作为其类型,它描述了对象可以具有的属性和行为。类定义了一组属性和方法,它们描述了对象的状态和操作。

例如一个Person类

Person *person = [[Person allco] init];
person就是Person实例化出来的一个对象

2.1 类的结构体

在ARC和MRC或多或少都了解过类的实现.

类在OC中其实是一个指向objc_class的结构体指针

typedef struct objc_class *Class;  
struct objc_class {  
    	Class isa;  
  		Class super_class                       OBJC2_UNAVAILABLE;  // 父类
        const char *name                        OBJC2_UNAVAILABLE;  // 类名
        long version                            OBJC2_UNAVAILABLE;  // 类的版本信息,默认为0
        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;  // 协议链表
}; 


2.2 对象的结构体

typedef struct objc_object {
    Class isa;
} *id;
  • isa 指针:这个指针指向他所属的类。
  • 对象的isa指针指向他的类。
    每个对象都有一个类,在Objective-C中,对象的类是isa指针决定的,即 isa 指针指向对象所属的类。
    person的类就是Person

2.2.1 元类

观察类的结构体

struct objc_class {  
    	Class isa;  。。。。。。。
}

类的结构体里面也有isa指针。实质上,OC中一切都是对象,这个类含有isa指针,所以,类也是一种对象。

那么类的isa指针指向哪里呢?类的isa指针指向该类的元类(MetaClass)。所以,元类就是类所属的类。

2.2.2 涉及消息转发机制

当你给对象发送消息时,消息是在寻找这个对象的类的方法列表。
当你给类发消息时,消息是在寻找这个类的元类的方法列表。

其原理就是 OC对象在发送消息时,运行时库会追寻着对象的isa指针得到对象所属的类。这个类包含了能应用于这个类的所有实例方法以及指向父类的指针,以便可以找到父类的实例方法。运行时库检查这个类和其父类的方法列表,找到与消息对应的方法。 编译器会将消息转换为消息函数objc_msgSend进行调用

后续会多次出现图 Instance实例 metaClass元类

【iOS开发】理解OC的类,父类,元类的关系

2.2.3 元类也有类

既然元类是个类,和之前的类一样也是一个对象,那元类的类是什么呢?

所有的元类都使用根元类作为他们的类。这就意味着所有NSObject的子类(大多数类)的元类都会以NSObject的元类作为他们的类,根元类的 isa 指针指向了它自己。

2.3.4 对象和Class的 isa指针

isa指针在对象里面表示某个对象是一个什么类,person对象就是一个Person类。

对于 struct objc_class *类型的Class类也有isa指针,也就是类本身也是一个对象,在类对象的isa的指向的类叫元类,类方法就定义在元类的接口部分。一个类可以有很多的实例,这些实例都指向了一个相同的对象。

Person可以有Student,Father,person等等等实例,这些实例都有isa指针指向Person,而Person的isa指针也有着唯一的元类。

【iOS开发】理解OC的类,父类,元类的关系文章来源地址https://www.toymoban.com/news/detail-437641.html

到了这里,关于【iOS开发】理解OC的类,父类,元类的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章主要是为了解答有关多态的那篇文章那块的一个奇怪现象,大家还记得这张

    2024年02月19日
    浏览(27)
  • typeScript中的类以及类的限制

    传统方法中,JavaScript通过构造函数实现类的概念,通过原型链实现继承。而在Es6中,我们终于迎来了class. typeScript除了实现了所有Es6中类的功能以外,还添加了一些新的用法。 虽然 JavaScript 中有类的概念,但是可能大多数 JavaScript 程序员并不是非常熟悉类,这里对类相关的概

    2024年02月05日
    浏览(27)
  • ios oc button 设置

    Button调整内部的子控件的位置            

    2024年02月16日
    浏览(26)
  • 【IOS】oc中property属性值详解

    1. atomic与nonatomic atomic :原子属性确保属性的读取和写入操作在多线程环境中是线程安全的。这意味着,当一个线程正在读取或写入属性时,其他线程不能同时访问该属性。虽然这提供了线程安全性,但它也引入了性能开销,因为每次访问都需要加锁和解锁。 nonatomic :非原子

    2024年02月21日
    浏览(25)
  • OC(iOS)中常见的面试题汇整(大全)

    你如何理解OC这门语言的?谈一下你对OC的理解? ​​​​​​​        OC语言是C语言的一个超集,只是在C语言的基础上加上了面向对象的语言特征,如:继承,封装,多态.        封装:把属性和方法封装成一个类,方便我们使用        多态:不同对象对于同一消息的不同响应,子

    2024年03月18日
    浏览(24)
  • 大数据、人工智能、机器学习、深度学习关系联系前言

    1.大数据和人工智能关系 2.机器学习、深度学习、人工智能关系 3.监督学习、无监督学习、半监督学习、强化学习、迁移学习关系 4.机器学习具体内容 1.数据驱动的人工智能 :人工智能系统需要大量的数据来进行训练和学习。大数据提供了海量的信息,可以用于训练机器学习

    2024年02月12日
    浏览(44)
  • (flutter)黑苹果系统 Xcode iOS flutter 跑通真机模拟器 此oc clover 彼oc swift

    前段时间写了关于flutter的一系列基础知识和入门的一些坑,中间把ios端的项目编译部署等工作一带而过,这里我觉得还是有必要专门写一篇文章来讲讲这个,顺便把环境问题也一起说了。 我们都知道开发ios应用需要用到苹果电脑,即使flutter也不例外,flutter编译构建需要Xc

    2024年02月07日
    浏览(38)
  • iOS从UI内存地址到读取成员变量(oc/swift)

    开发调试时,我们发现bug时常首先是从UI显示发现异常,下一步才会去定位UI相关连的数据的。XCode有给我们提供一系列debug工具,但是很多人可能还没有形成一套稳定的调试流程,因此本文尝试解决这个问题,顺便提出一个 暴论 :UI显示异常问题只需要两个步骤就能完成定位

    2023年04月19日
    浏览(61)
  • 从零开始理解Linux中断架构(1)-前言

    前言         前段时间在转行手撸WIFI路由器,搞wifi路由器需要理解网络驱动程序,以太网卡驱动程序,无线WIFI驱动程序,而网卡驱动的关键路径就在中断程序中,需要了解NIC设备驱动程序如何收发数据,为了彻底的知道数据包是如何二层传递上来的,又需要了解一点Lin

    2024年02月09日
    浏览(43)
  • 【C++初阶(一)】学习前言 命名空间与IO流

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 C++是基于C语言而产生的,它既可以进行C语言的

    2024年02月08日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包