Objective-C基础(二)

Objective-C基础(二)
最新回答
冭儍冭迗眞

2024-03-07 19:43:18

Objective-C基础(二)主要介绍了OC对象分类、class与object_getClass方法的区别以及方法的隐式参数。以下是详细解析:

1. OC对象分类

OC对象分为三类:实例对象(instance)、类对象(class)和元类对象(meta-class)。

  • 实例对象(instance)

    存储isa指针和成员变量的

    成员变量的名称、类型等信息存储在类对象中。

    举例:女娲根据“人类”这个类对象(存储身高、体重等成员变量信息)捏出具体的人(存储具体的成员变量值)。

  • 类对象(class)

    存储isa指针、superclass指针、属性信息、对象方法信息、协议信息、成员变量信息。

    对象方法信息统一存储在类对象中,所有实例共享。

  • 元类对象(meta-class)

    存储类方法信息

    类方法的调用通过元类对象实现。

isa指针关系
  • instance对象的isa指针指向class对象
  • class对象的isa指针指向meta-class对象
  • meta-class对象的isa指针指向基类的meta-class对象
  • class对象的superclass指针指向父类的class对象,基类的superclass为nil。
  • meta-class对象的superclass指针指向父类的meta-class对象
  • 基类meta-class对象的superclass指向基类的class对象(特殊规则,需记忆)。

2. class与object_getClass方法
  • 相同点

    instance对象调用,均返回其对应的class对象

  • 不同点

    class对象调用class方法,无论调用多少次,始终返回class对象本身

    class对象调用object_getClass方法,返回其对应的meta-class对象

记忆技巧
  • class方法:

    实例对象 → 返回其class对象。

    类对象 → 返回自身。

  • object_getClass方法:

    返回对象的isa指针指向的对象。

源码解析// 类方法,返回自身+ (Class)class { return self;}// 实例方法,查找isa(类)- (Class)class { return object_getClass(self); // 实际调用object_getClass}Class object_getClass(id obj) { if (obj) return obj->getIsa(); // 返回isa指针 else return Nil;}3. 方法的隐式参数

OC中所有方法调用均包含两个隐式参数:self和_cmd。

  • self

    表示调用该方法的对象(实例方法)或类(类方法)。

  • _cmd

    表示当前被调用的方法名。

示例// 假设universe类有如下类方法+ (void)printAxio:(NSString *)axio { NSLog(@"%@", axio);}// 调用类方法[universe printAxio:@"文明不断增长和扩张,但宇宙中的物质总量保持不变"];// 隐式参数解析:// - self: universe类对象(调用者)// - _cmd: printAxio(方法名)// - 显式参数: axio(@"文明...")总结
  1. 对象分类

    实例对象存储成员变量值,类对象存储方法信息,元类对象存储类方法信息。

    isa指针和superclass指针的指向关系需重点理解。

  2. 方法调用

    class和object_getClass的区别在于对类对象的处理。

  3. 隐式参数

    self和_cmd是方法调用的底层机制,理解它们有助于深入掌握OC运行时。

重点:知识点1(对象分类与isa指针关系)是理解OC运行时的基础,务必掌握!