面试题答案
一键面试1. 元类(meta - class)在对象创建过程中的作用
- 存储类方法:在Objective - C中,每个类都有一个与之关联的元类。元类的主要作用之一是存储类方法。当创建一个类的实例对象时,对象通过isa指针指向类对象,而类对象通过isa指针指向元类对象。这使得类方法的调用能够找到对应的实现。例如,对于一个自定义类
MyClass
,如果定义了类方法+(void)classMethod
,这个方法的实现就存储在MyClass
的元类中。 - 对象创建的关键链接:在对象创建过程中,
alloc
类方法实际上是定义在元类中的。当发送alloc
消息给一个类(如[MyClass alloc]
)时,实际上是元类接收到了这个消息。元类负责分配内存来创建对象实例,并初始化对象的isa
指针,使其指向所属的类。这样就建立了从对象实例到类,再到元类的链接关系,保证了对象能够正确地找到实例方法和类方法。
2. ARC(自动引用计数)机制下对象生命周期管理的底层实现原理
- 引用计数的内存操作:在ARC机制下,每个对象都有一个引用计数(Reference Count,RC)。引用计数本质上是一个存储在对象内存中的整数值。当对象被创建时,引用计数初始化为1。例如,当执行
MyClass *obj = [[MyClass alloc] init];
时,obj
指向的对象引用计数为1。 - 引用计数的增加:当有新的强指针指向该对象时,引用计数会增加。比如
MyClass *anotherObj = obj;
,此时对象的引用计数会加1。在底层实现中,这通常是通过一个原子操作来增加对象内存中引用计数的值。 - 引用计数的减少:当指向对象的强指针被销毁或者重新指向其他对象时,引用计数会减少。例如
anotherObj = nil;
,对象的引用计数会减1。同样,这也是通过原子操作在对象内存中减少引用计数的值。 - 对象的销毁:当对象的引用计数减为0时,ARC会自动调用对象的
dealloc
方法,并释放对象所占用的内存。在释放内存时,系统会清理对象内部的成员变量以及相关资源。这确保了内存的自动回收,避免了手动管理引用计数时可能出现的内存泄漏和悬空指针问题。
总之,元类在对象创建过程中起到了类方法存储和对象创建引导的关键作用,而ARC通过对对象引用计数在内存层面的精确操作,实现了对象生命周期的自动化管理。