【iOS】OC中类,父类,元类的关系

8 篇文章 0 订阅

前言

在 Objective-C 中,类、对象和元类是构建面向对象编程模型的重要组成部分。理解它们之间的关系对于深入掌握 Objective-C 编程语言以及运行时机制至关重要。让我们逐步探索这些概念。

1. 类和对象的关系

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

例如,我们有一个 Person 类:

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic) NSInteger age;

- (void)introduce;

@end

@implementation Person

- (void)introduce {
    NSLog(@"My name is %@ and I am %ld years old.", self.name, (long)self.age);
}

@end

通过以下代码,我们可以实例化一个 Person 对象:

Person *person = [[Person alloc] init];
person.name = @"Alice";
person.age = 30;
[person introduce]; // 输出: My name is Alice and I am 30 years old.

这里的 personPerson 类的一个对象,具有 nameage 属性,以及 introduce 方法。

2. 类的结构体和对象的结构体

2.1 类的结构体

在 Objective-C 中,类其实是指向 objc_class 结构体的指针,其结构体包含了类的元数据信息:

typedef struct objc_class *Class;

struct objc_class {
    Class isa;                          // 指向元类的指针
    Class super_class;                  // 父类
    const char *name;                   // 类名
    long version;                       // 版本信息
    long info;                          // 类信息
    long instance_size;                 // 实例变量大小
    struct objc_ivar_list *ivars;       // 成员变量列表
    struct objc_method_list **methodLists; // 方法定义列表
    struct objc_cache *cache;           // 方法缓存
    struct objc_protocol_list *protocols; // 协议链表
};
2.2 对象的结构体

在 Objective-C 中,对象是指向 objc_object 结构体的指针,其结构体非常简单:

typedef struct objc_object {
    Class isa;  // 指向所属类的指针
} *id;

对象的 isa 指针指向其所属的类,每个对象都有一个类,通过 isa 指针来确定其类型。

3. 元类(Meta Class)

3.1 元类的定义

元类是类的类,也是类的模板,它描述了类本身的行为和方法。在 Objective-C 中,每个类在运行时都有一个对应的元类,用于管理类方法。

3.2 元类的结构

元类与普通类的结构类似,但用于描述类对象:

struct objc_class {
    Class isa;  // 指向元类的指针
    // 其他类信息,如父类指针、类名等
};

每个类的元类都是根元类的实例,根元类的 isa 指针指向自身。

赋上一张关系图:
Alt

4. 消息传递和方法查找

在 Objective-C 中,当发送消息给对象时,运行时库会根据对象的 isa 指针找到对象的类,然后查找该类及其父类的方法列表来寻找对应的方法。类方法则通过元类来查找。

编译器会将消息转换为 objc_msgSend 函数的调用,这是 Objective-C 消息传递的核心机制。

5. 总结

  • 类和对象的关系:类是对象的模板,对象是类的实例化结果。
  • 类的结构体:描述了类的元数据信息,包括指向父类的指针、类名、版本信息等。
  • 对象的结构体:简单地指向所属类的指针。
  • 元类:描述了类本身的行为和方法,每个类都有对应的元类,元类是根元类的实例。
  • 消息传递和方法查找:通过对象的 isa 指针和元类来定位方法的具体实现,实现了 Objective-C 中的消息传递机制。

通过这些概念的理解,可以更深入地学习 Objective-C 运行时机制和消息传递的工作原理。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值