MST
星途 面试题库

面试题:Objective-C中self与super在内存管理与对象生命周期方面的联系与区别

结合Objective-C的内存管理机制(如ARC或MRC),阐述self与super在对象的内存管理和对象生命周期维护过程中扮演的角色以及存在哪些区别,如果在dealloc方法中使用self和super调用父类的dealloc方法会有什么不同的结果?
17.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

1. ARC 与 MRC 简介

  • ARC(自动引用计数):ARC 是 iOS 5.0 引入的一种自动内存管理机制。编译器会自动在适当的地方插入引用计数管理代码,开发者无需手动调用 retainreleaseautorelease 等方法。
  • 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]