MST

星途 面试题库

面试题:Objective-C中弱引用和强引用在内存管理上有何不同

请详细阐述Objective-C里弱引用和强引用在内存管理机制方面的差异,包括它们对对象生命周期的影响,以及在实际代码场景中如何体现这些差异。
20.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

强引用

  1. 内存管理机制方面:强引用是一种拥有关系。当一个对象被强引用所指向时,该对象的引用计数会增加。只要有至少一个强引用指向对象,对象就会留在内存中,不会被释放。
  2. 对对象生命周期的影响:只要存在强引用指向对象,对象就不会被销毁。只有当指向对象的所有强引用都被移除(比如变量超出作用域、被赋值为nil等),对象的引用计数降为0,对象才会被系统回收,释放其所占用的内存。
  3. 实际代码场景体现
// 创建一个对象并通过强引用变量持有
NSObject *strongObject = [[NSObject alloc] init];
// strongObject 对创建的 NSObject 对象是强引用,该对象引用计数至少为1
// 当 strongObject 超出作用域或被赋值为 nil 时,NSObject 对象引用计数减1,若减为0则被释放
strongObject = nil;

弱引用

  1. 内存管理机制方面:弱引用不拥有对象,不会增加对象的引用计数。弱引用只是指向对象,但对对象的生存与否没有决定权。
  2. 对对象生命周期的影响:对象的生命周期不受弱引用的影响。当指向对象的所有强引用都消失,对象被释放时,所有指向该对象的弱引用会自动被设置为nil,即所谓的“零弱引用”特性。这可以有效避免野指针的产生。
  3. 实际代码场景体现
__weak NSObject *weakObject;
{
    NSObject *strongObject = [[NSObject alloc] init];
    weakObject = strongObject;
    // 此时 weakObject 弱引用 strongObject 创建的对象,对象引用计数不受 weakObject 影响
}
// 这里 strongObject 超出作用域被销毁,对象引用计数减为0被释放
// weakObject 自动被设置为 nil,避免成为野指针
if (weakObject) {
    // 不会进入这里,因为 weakObject 已经是 nil
}

两者差异总结

  • 引用计数影响:强引用增加对象引用计数,弱引用不影响。
  • 对象生命周期决定权:强引用决定对象是否存活,只要有强引用在,对象不被释放;弱引用不决定对象生命周期,对象存活与否取决于强引用。
  • 实际应用场景:强引用适用于需要长期持有对象的场景,比如类中的属性通常用强引用;弱引用适用于避免循环引用(如视图控制器和其代理之间常用弱引用)以及在对象释放后不想产生野指针的场景。