面试题答案
一键面试ARC管理内存方式
- 自动计数调整:ARC 会在编译时自动在代码中合适的位置插入引用计数的相关代码。当对象被创建时,ARC 会自动增加其引用计数,例如使用
alloc
、new
、copy
或mutableCopy
方法创建对象时,引用计数设为1。 - 引用关系变化:当对象被赋值给一个新的变量(强引用)时,新变量对对象的引用计数加1;当变量超出作用域或被设置为
nil
时,ARC 会自动减少该对象的引用计数。 - 内存释放:当对象的引用计数降为0时,ARC 会自动调用对象的
dealloc
方法来释放其所占用的内存空间。
ARC 与手动引用计数的主要区别
- 代码编写量
- ARC:大大减少了手动编写引用计数管理代码的工作量,如
retain
、release
和autorelease
等操作都由编译器自动完成,开发者可以更专注于业务逻辑。 - 手动引用计数:开发者需要在代码中显式地调用
retain
增加引用计数,release
减少引用计数,以及适时使用autorelease
将对象加入自动释放池,代码编写较为繁琐且容易出错。
- ARC:大大减少了手动编写引用计数管理代码的工作量,如
- 内存管理安全性
- ARC:编译器会分析对象的生命周期,自动处理引用计数,降低了因忘记释放对象或过度释放对象导致的内存泄漏和悬空指针等问题的风险。
- 手动引用计数:由于手动管理,一旦开发者在引用计数操作上出现失误,比如多释放一次对象,就可能导致程序崩溃;或者忘记释放对象,就会造成内存泄漏。
- 性能方面
- ARC:虽然在编译时插入引用计数代码会增加一些编译时间,但运行时性能与手动引用计数相当,并且编译器可以对生成的引用计数代码进行优化。
- 手动引用计数:开发者可以通过精心优化引用计数操作,在某些特定场景下获得略微更好的性能,但这需要对内存管理有深入理解,且优化过程较为复杂。