MST

星途 面试题库

面试题:Objective-C 性能优化之内存管理

在Objective-C中,简述ARC(自动引用计数)机制的工作原理。如果在ARC环境下遇到内存泄漏问题,你可能会从哪些方面去排查?
29.2万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

ARC工作原理

  1. 引用计数:ARC为每个对象维护一个引用计数。当对象被创建时,引用计数初始化为1。
  2. 引用变化
    • 当对象被强引用时(如赋值给强指针变量),其引用计数加1。
    • 当对象的强引用被释放(如强指针变量超出作用域或被赋值为nil),其引用计数减1。
  3. 对象销毁:当对象的引用计数降为0时,ARC会自动释放该对象所占用的内存。

排查内存泄漏方面

  1. 循环引用
    • 对象间循环强引用:检查自定义类中是否存在两个或多个对象相互持有强引用的情况,例如两个视图控制器相互持有对方的强引用。可以通过将其中一个引用改为弱引用(weak)或无主引用(unowned)来打破循环。
    • block循环引用:在使用block时,检查block内部是否对外部对象有强引用,同时外部对象又持有该block,形成循环引用。解决方法是使用__weak__block修饰符来避免循环。
  2. NSTimer:如果使用NSTimer,检查是否在不需要时没有 invalidate 它,导致其目标对象无法释放。
  3. 集合类:确认集合类(如NSArrayNSDictionary)中是否错误地持有了不需要的对象引用,而这些对象本应被释放。
  4. Core Foundation 桥接:在进行Core Foundation与Objective-C对象桥接时,确保正确处理对象所有权。例如,使用CFBridgingRelease将Core Foundation对象转换为Objective-C对象并转移所有权给ARC管理。
  5. 自定义内存管理方法:如果在ARC环境下仍存在自定义的内存管理方法(如allocretainrelease等,虽然ARC环境下不建议使用,但可能存在遗留代码),检查这些方法的使用是否正确,是否破坏了ARC的正常引用计数机制。