返回

指针之weak & unowned的理解和使用

IOS

内存管理机制的必要性

在计算机系统中,内存是有限的资源。当程序运行时,需要在内存中分配空间来存储数据和代码。如果不回收利用,一直创建,内存很快就被耗完了。为了回收利用,系统需要将没有继续使用的那些对象给回收。

引用计数原理

怎么鉴定哪些可以回收哪些不可以回收,于是就捣鼓出了引用计数的原理。引用计数是一种内存管理机制,用于跟踪每个对象被引用的次数。当一个对象的引用计数为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指针比强指针的性能开销更高,使用起来也更复杂。