指针之weak & unowned的理解和使用
2023-11-09 14:39:24
内存管理机制的必要性
在计算机系统中,内存是有限的资源。当程序运行时,需要在内存中分配空间来存储数据和代码。如果不回收利用,一直创建,内存很快就被耗完了。为了回收利用,系统需要将没有继续使用的那些对象给回收。
引用计数原理
怎么鉴定哪些可以回收哪些不可以回收,于是就捣鼓出了引用计数的原理。引用计数是一种内存管理机制,用于跟踪每个对象被引用的次数。当一个对象的引用计数为0时,表示该对象不再被任何变量引用,可以被回收。
ARC和MRC
ARC(Automatic Reference Counting)是苹果公司在iOS 5中引入的一项内存管理技术。ARC可以自动管理对象的引用计数,从而简化了内存管理的过程。
MRC(Manual Reference Counting)是ARC出现之前iOS中使用的内存管理机制。MRC需要开发者手动管理对象的引用计数,这使得内存管理变得更加复杂。
weak和unowned指针
在ARC中,weak和unowned指针是两种特殊的指针类型,可以用来管理对象的引用计数。
- weak指针:weak指针指向的对象可能会被释放,因此在使用weak指针之前,需要先检查对象的引用计数是否为0。
- unowned指针:unowned指针指向的对象不会被释放,因此可以使用unowned指针直接访问对象。
weak和unowned指针的使用场景
- weak指针通常用于管理循环引用的情况。循环引用是指两个或多个对象相互引用,导致引用计数无法为0,从而无法被回收。
- unowned指针通常用于管理强引用循环的情况。强引用循环是指两个或多个对象相互强引用,导致引用计数无法为0,从而无法被回收。
weak和unowned指针的注意事项
- weak指针可能会指向nil,因此在使用weak指针之前,需要先检查对象的引用计数是否为0。
- unowned指针不能指向可能被释放的对象,否则会导致程序崩溃。
weak和unowned指针的使用示例
class Person {
weak var friend: Person?
}
class Car {
unowned var owner: Person
}
在这个示例中,Person类中的friend属性是一个weak指针,指向另一个Person对象。Car类中的owner属性是一个unowned指针,指向一个Person对象。
weak和unowned指针的性能开销
weak和unowned指针比强指针的性能开销更高。这是因为weak和unowned指针需要在内存中存储额外的信息,以便跟踪对象的引用计数。
weak和unowned指针的优缺点
- 优点:
- 可以管理循环引用和强引用循环
- 可以防止内存泄漏
- 缺点:
- 性能开销更高
- 使用起来更复杂
总结
weak和unowned指针是ARC中两种特殊的指针类型,可以用来管理对象的引用计数。weak指针指向的对象可能会被释放,因此在使用weak指针之前,需要先检查对象的引用计数是否为0。unowned指针指向的对象不会被释放,因此可以使用unowned指针直接访问对象。weak和unowned指针通常用于管理循环引用和强引用循环。weak和unowned指针比强指针的性能开销更高,使用起来也更复杂。