面试题答案
一键面试ARC工作原理
- 引用计数:ARC为每个对象维护一个引用计数。当对象被创建时,引用计数初始化为1。
- 引用变化:
- 当对象被强引用时(如赋值给强指针变量),其引用计数加1。
- 当对象的强引用被释放(如强指针变量超出作用域或被赋值为
nil
),其引用计数减1。
- 对象销毁:当对象的引用计数降为0时,ARC会自动释放该对象所占用的内存。
排查内存泄漏方面
- 循环引用:
- 对象间循环强引用:检查自定义类中是否存在两个或多个对象相互持有强引用的情况,例如两个视图控制器相互持有对方的强引用。可以通过将其中一个引用改为弱引用(
weak
)或无主引用(unowned
)来打破循环。 - block循环引用:在使用block时,检查block内部是否对外部对象有强引用,同时外部对象又持有该block,形成循环引用。解决方法是使用
__weak
或__block
修饰符来避免循环。
- 对象间循环强引用:检查自定义类中是否存在两个或多个对象相互持有强引用的情况,例如两个视图控制器相互持有对方的强引用。可以通过将其中一个引用改为弱引用(
- NSTimer:如果使用
NSTimer
,检查是否在不需要时没有 invalidate 它,导致其目标对象无法释放。 - 集合类:确认集合类(如
NSArray
、NSDictionary
)中是否错误地持有了不需要的对象引用,而这些对象本应被释放。 - Core Foundation 桥接:在进行Core Foundation与Objective-C对象桥接时,确保正确处理对象所有权。例如,使用
CFBridgingRelease
将Core Foundation对象转换为Objective-C对象并转移所有权给ARC管理。 - 自定义内存管理方法:如果在ARC环境下仍存在自定义的内存管理方法(如
alloc
、retain
、release
等,虽然ARC环境下不建议使用,但可能存在遗留代码),检查这些方法的使用是否正确,是否破坏了ARC的正常引用计数机制。