返回

苹果isa、类isa和元类的底层原理解析

IOS

isa:类的实例变量

isa的存储位置

  • 变量中的存储位置

  • obj.isa ->类的实例

  • isa就是class,class就是isa,是等同关系

isa的存储作用

  • 判断变量所属类

  • 调用classMethod

类isa:元类

类isa的存储位置

  • 一般存储在一个叫metaClass的全局变量

  • isa->Class->metaClass

  • isa->metaClass-> isa->Class->metaClass

  • 类的isa可以理解成一个指向自身的指向

类isa的存储作用

  • 类isa主要存储的是class的实例变量的类型信息,比isa要丰富

苹果isa:根类

苹果isa的存储位置

  • 系统会存储一个指向本身的指针

  • 根类的metaClass是空的

苹果isa的存储作用

  • 作为isa查找的终结条件

示例代码:

@interface TestProto : NSObject
{
}

@interface Test1 : TestProto
{
@end
}

@interface Test2 : TestProto
{
@end
}

// 执行 isa 等于类型时

Test1 *a = [[Test1 new] autorelease];
Test2 *b = [[Test2 new] autorelease];
TestProto *c = [[TestProto new] autorelease];

if (c==a) {
    NSLog(@"c == a");
}else{
    NSLog(@"c != a");
}
if (c==b) {
    NSLog(@"c == b");
}else{
    NSLog(@"c != b");
}

isa、类isa、元类的区别:

内存占用空间比较大的是metaClass

  • isa
  • metaClass
  • isa->metaClass
  • isa->metaClass->isa

isa->metaClass->isa有循环

内存占用关系:

  • 根类占用空间最小

  • isa占一个int

  • metaClass占用最大

执行效率:

  • metaClass的查找效率最高

  • isa的查找效率次之

  • is的查找效率最低

结论:

  • 通过对isa、类isa、元类的分析,我们能够深入了解编程的重要概念和细节。本文提供的代码示例有助于读者更直观和深入的理解这些内容,以便他们在编码时能够更合理和高效地运用。

  • 此外,理解这些内容也是软件设计和编程技巧的重要组成部分。掌握isa、类isa和元类等方面的深入信息对于软件工程师来说非常宝贵,同时也是持续学习和进步的必要条件。

  • 掌握isa、类isa、元类,对于理解和编写有效的代码、发现和解决代码错误等非常重要,也是编写出更好代码所必需的。

  • 学习这些内容对刚开始接触编程的新手来说,也许不是那么容易的一件事,但这是一个非常宝贵的学习过程,对于软件工程师来说很有必要的。