MST

星途 面试题库

面试题:Objective-C 元类(Meta Class)的深度剖析与应用

深入解释 Objective-C 中元类(Meta Class)的概念、作用以及它与类和对象之间的关系。请举例说明在哪些复杂的编程场景下,对元类的理解和操作是至关重要的,比如实现一些设计模式或者运行时功能扩展等场景中,元类是如何发挥作用的。
23.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

元类(Meta Class)概念

在Objective-C中,元类是存储类方法的类。每个类都有一个对应的元类。类对象存储实例变量和实例方法,而元类对象存储类方法。元类的isa指针指向根元类,根元类的isa指针指向自己。

元类的作用

  1. 存储类方法:使得类方法有了存储和调用的载体。例如,+ (void)aClassMethod 这样的类方法就存储在元类中。
  2. 运行时消息转发:在运行时,当向类发送一个类方法消息时,消息会在元类的方法列表中查找。

元类与类和对象的关系

  1. 对象与类:对象是类的实例,对象通过isa指针指向其所属的类。类中定义了对象所具有的实例变量和实例方法。
  2. 类与元类:类是元类的实例,类通过isa指针指向其对应的元类。元类存储了类方法。根类(如 NSObject)的元类的isa指针指向自身,形成一个闭环结构。

复杂编程场景举例

  1. 单例模式实现:在实现单例模式时,元类起着关键作用。单例模式通过类方法提供一个全局唯一的实例。这个类方法就存储在元类中。比如:
+ (instancetype)sharedInstance {
    static id _sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}

这里的 sharedInstance 类方法在元类中,保证了无论在何处调用这个类方法,都能获取到全局唯一的实例。 2. 运行时功能扩展:利用元类可以在运行时动态添加类方法。例如,在应用启动时,通过运行时机制向某个类动态添加类方法:

// 动态添加的类方法
void newClassMethod(id self, SEL _cmd) {
    NSLog(@"This is a newly added class method");
}

// 在运行时添加类方法
Class class = [YourClass class];
class_addMethod(class, @selector(newClassMethod), (IMP)newClassMethod, "v@:");

这时候元类就会更新其方法列表,使得新添加的类方法能够被调用。这种机制在很多框架的功能扩展和定制化中非常有用。