强引用
- 内存管理机制方面:强引用是一种拥有关系。当一个对象被强引用所指向时,该对象的引用计数会增加。只要有至少一个强引用指向对象,对象就会留在内存中,不会被释放。
- 对对象生命周期的影响:只要存在强引用指向对象,对象就不会被销毁。只有当指向对象的所有强引用都被移除(比如变量超出作用域、被赋值为
nil
等),对象的引用计数降为0,对象才会被系统回收,释放其所占用的内存。
- 实际代码场景体现:
// 创建一个对象并通过强引用变量持有
NSObject *strongObject = [[NSObject alloc] init];
// strongObject 对创建的 NSObject 对象是强引用,该对象引用计数至少为1
// 当 strongObject 超出作用域或被赋值为 nil 时,NSObject 对象引用计数减1,若减为0则被释放
strongObject = nil;
弱引用
- 内存管理机制方面:弱引用不拥有对象,不会增加对象的引用计数。弱引用只是指向对象,但对对象的生存与否没有决定权。
- 对对象生命周期的影响:对象的生命周期不受弱引用的影响。当指向对象的所有强引用都消失,对象被释放时,所有指向该对象的弱引用会自动被设置为
nil
,即所谓的“零弱引用”特性。这可以有效避免野指针的产生。
- 实际代码场景体现:
__weak NSObject *weakObject;
{
NSObject *strongObject = [[NSObject alloc] init];
weakObject = strongObject;
// 此时 weakObject 弱引用 strongObject 创建的对象,对象引用计数不受 weakObject 影响
}
// 这里 strongObject 超出作用域被销毁,对象引用计数减为0被释放
// weakObject 自动被设置为 nil,避免成为野指针
if (weakObject) {
// 不会进入这里,因为 weakObject 已经是 nil
}
两者差异总结
- 引用计数影响:强引用增加对象引用计数,弱引用不影响。
- 对象生命周期决定权:强引用决定对象是否存活,只要有强引用在,对象不被释放;弱引用不决定对象生命周期,对象存活与否取决于强引用。
- 实际应用场景:强引用适用于需要长期持有对象的场景,比如类中的属性通常用强引用;弱引用适用于避免循环引用(如视图控制器和其代理之间常用弱引用)以及在对象释放后不想产生野指针的场景。