返回

iOS底层原理:类 & isa经典面试题深度剖析

IOS

iOS 底层原理中的类和 ISA 走位

在 iOS 应用开发中,深入了解底层原理至关重要,尤其是涉及到类和 ISA(对象指针)走位时。这些概念在面试中经常被提及,透彻地理解它们可以显著提升你的技术实力和面试信心。

类的存在和 ISA 指针的作用

类是一个蓝图,定义了对象的属性和方法。在内存中,类只存在一份,称为类对象。ISA(“isa”指针的缩写)指向每个对象的类对象。ISA 指针具有以下作用:

  • 确定对象类型: ISA 指针指向对象的类对象,使你能够获取该对象的类信息并确定其类型。
  • 消息转发: 当一个对象收到一条消息(方法调用)时,如果对象本身没有实现该消息,ISA 指针将查找类对象中的方法列表,从而实现消息转发机制。

ISA 走位

ISA 走位是指对象 ISA 指针在继承关系中向上或向下移动的过程。

  • 向上走位: 子类对象的 ISA 指针指向父类对象的类对象。
  • 向下走位: 父类对象的 ISA 指针指向子类对象的类对象。

这允许子类继承父类的方法,同时允许父类重写子类的方法。

ISA 指针存储

ISA 指针存储在对象的第一个成员变量中。这意味着你可以使用 object_getClass() 函数来访问对象的 ISA 指针。

类的结构

类结构包括以下元素:

  • 类名: 类的唯一标识符。
  • 属性列表: 类中定义的属性。
  • 方法列表: 类中定义的方法。
  • 超类指针: 指向父类的类对象指针。
  • 元类指针: 指向类对象的类对象指针。

代码示例

以下 Objective-C 代码示例展示了类的声明和实例化:

@interface Person : NSObject
{
    NSString *_name;
    int _age;
}

- (instancetype)initWithName:(NSString *)name age:(int)age;
- (NSString *)name;
- (void)setName:(NSString *)name;
- (int)age;
- (void)setAge:(int)age;
@end

@implementation Person

- (instancetype)initWithName:(NSString *)name age:(int)age
{
    self = [super init];
    if (self) {
        _name = name;
        _age = age;
    }
    return self;
}

- (NSString *)name
{
    return _name;
}

- (void)setName:(NSString *)name
{
    _name = name;
}

- (int)age
{
    return _age;
}

- (void)setAge:(int)age
{
    _age = age;
}

@end

int main()
{
    Person *person = [[Person alloc] initWithName:@"John Doe" age:30];
    NSLog(@"Name: %@, Age: %d", person.name, person.age);
    return 0;
}

常见问题解答

1. 类存在几份?
答案:一份

2. ISA 指针的用途是什么?
答案:确定对象类型和消息转发。

3. ISA 走位是如何实现的?
答案:通过子类继承父类和父类重写子类的方法。

4. ISA 指针存储在何处?
答案:对象的第一个成员变量中。

5. 类的结构包括哪些元素?
答案:类名、属性列表、方法列表、超类指针、元类指针。

结论

对类、ISA 走位、继承关系和类结构的深入理解是 iOS 开发人员必不可少的技能。掌握这些概念将使你能够编写更健壮、更可维护的代码,并提升你在面试中的竞争力。通过持续学习和练习,你可以提高对 iOS 底层原理的认识,并成为一名更熟练的开发者。