面试题答案
一键面试元类(Meta Class)概念
在Objective-C中,元类是存储类方法的类。每个类都有一个对应的元类。类对象存储实例变量和实例方法,而元类对象存储类方法。元类的isa指针指向根元类,根元类的isa指针指向自己。
元类的作用
- 存储类方法:使得类方法有了存储和调用的载体。例如,
+ (void)aClassMethod
这样的类方法就存储在元类中。 - 运行时消息转发:在运行时,当向类发送一个类方法消息时,消息会在元类的方法列表中查找。
元类与类和对象的关系
- 对象与类:对象是类的实例,对象通过isa指针指向其所属的类。类中定义了对象所具有的实例变量和实例方法。
- 类与元类:类是元类的实例,类通过isa指针指向其对应的元类。元类存储了类方法。根类(如
NSObject
)的元类的isa指针指向自身,形成一个闭环结构。
复杂编程场景举例
- 单例模式实现:在实现单例模式时,元类起着关键作用。单例模式通过类方法提供一个全局唯一的实例。这个类方法就存储在元类中。比如:
+ (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@:");
这时候元类就会更新其方法列表,使得新添加的类方法能够被调用。这种机制在很多框架的功能扩展和定制化中非常有用。