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

文章详细阐述了Objective-C中类和对象的概念及其关系,指出类是对象的模板,对象是类的实例。类的结构体包含isa指针,指向元类。对象的isa指针指向其所属的类。元类是类的对象,它的isa指针指向根元类,通常为NSObject的元类。文章还提到了消息转发机制,当对象收到消息时,运行时会沿着isa指针查找相应的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在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元类

请添加图片描述

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指针也有着唯一的元类。

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值