面试题答案
一键面试1. ARC 与 MRC 简介
- ARC(自动引用计数):ARC 是 iOS 5.0 引入的一种自动内存管理机制。编译器会自动在适当的地方插入引用计数管理代码,开发者无需手动调用
retain
、release
和autorelease
等方法。 - MRC(手动引用计数):在 MRC 下,开发者需要手动管理对象的引用计数,通过调用
retain
增加引用计数,release
减少引用计数,当引用计数为 0 时,对象内存被释放。
2. self 与 super 在内存管理和对象生命周期中的角色
- self:
- 内存管理:
self
代表当前对象实例。在对象的方法中,self
可用于访问对象的属性和方法,而这些属性可能涉及到内存管理。例如,当通过self
设置一个强引用属性时,会增加属性所指向对象的引用计数;设置为nil
时,会减少引用计数。 - 对象生命周期:
self
存在于对象从创建(alloc + init)到销毁(dealloc)的整个生命周期中。对象在创建时,self
被初始化指向新创建的对象实例,在对象销毁时,self
所代表的对象实例内存即将被释放。
- 内存管理:
- super:
- 内存管理:
super
本身并不直接参与内存管理操作,但在调用父类的方法时,会涉及到父类中与内存管理相关的逻辑。例如,调用父类的init
方法可能会初始化父类的属性,这些属性的内存管理遵循父类的逻辑。 - 对象生命周期:
super
在对象生命周期中用于调用父类在特定阶段的实现,如在对象初始化和销毁阶段。它帮助维护从父类继承下来的状态和行为,确保对象生命周期的完整性。
- 内存管理:
3. self 与 super 的区别
- 方法调用:
self
调用的是当前类的方法实现,如果当前类没有实现该方法,会沿着继承链向上查找;而super
调用的是父类的方法实现,跳过当前类的实现。 - 内存管理视角:
self
主要关注当前对象自身的内存管理,包括对其属性和关联对象的管理;super
关注的是父类层面的内存管理和对象状态维护,保证父类部分的正确销毁和初始化。
4. 在 dealloc 方法中使用 self 和 super 调用父类 dealloc 方法的结果
- 使用
self
调用父类dealloc
:在dealloc
方法中使用self
调用父类dealloc
方法是错误的做法。因为dealloc
方法的目的是释放对象占用的资源,当对象开始执行dealloc
时,其引用计数已经为 0,即将被销毁。此时如果使用self
调用父类dealloc
,会导致循环调用dealloc
,因为self
调用方法会从当前类开始查找,又会进入当前dealloc
方法,最终导致程序崩溃。 - 使用
super
调用父类dealloc
:这是正确的做法。super
直接调用父类的dealloc
方法,确保父类部分的资源得到正确释放。在子类的dealloc
方法中,通常在释放完子类自身的资源后,调用[super dealloc]
,以完成整个对象的销毁过程,保证对象生命周期的完整性。在 ARC 下,编译器会自动处理父类dealloc
的调用,开发者无需手动编写[super dealloc]
。