返回

weak的使用原理

IOS

添加弱引用(一个__weak 修饰符)

在Objective-C中,使用__weak修饰符来添加弱引用。弱引用是一种特殊的引用,它不会阻止对象被释放。当一个对象被释放时,它的所有强引用都将被清除,但弱引用仍然存在。这使得弱引用非常适合用于那些不需要阻止对象被释放的情况,例如委托、观察者和计时器。

weak 的实现原理

weak的实现原理是使用一个名为“关联对象”的数据结构。关联对象是一种可以附加到任何对象上的数据,它不会影响对象的内存管理。当一个对象被创建时,它会创建一个关联对象来存储它的弱引用。当对象被释放时,它的关联对象也会被释放,这将导致它的弱引用被清除。

什么时候使用 weak

weak引用应该用于那些不需要阻止对象被释放的情况。例如:

  • 委托:委托是一种对象之间的通信机制,它允许一个对象将消息发送给另一个对象。当一个对象被释放时,它的所有强引用都将被清除,但它的弱引用仍然存在。这使得weak引用非常适合用于委托,因为委托不需要阻止对象被释放。
  • 观察者:观察者是一种对象之间的通信机制,它允许一个对象监视另一个对象的状态变化。当一个对象被释放时,它的所有强引用都将被清除,但它的弱引用仍然存在。这使得weak引用非常适合用于观察者,因为观察者不需要阻止对象被释放。
  • 计时器:计时器是一种可以重复执行任务的对象。当一个对象被释放时,它的所有强引用都将被清除,但它的弱引用仍然存在。这使得weak引用非常适合用于计时器,因为计时器不需要阻止对象被释放。

什么时候不能使用 weak

weak引用不能用于那些需要阻止对象被释放的情况。例如:

  • 属性:属性是一个对象的状态信息。当一个对象被释放时,它的所有强引用都将被清除,但它的弱引用仍然存在。这使得weak引用不能用于属性,因为属性需要阻止对象被释放。
  • 局部变量:局部变量是函数或方法中的临时变量。当函数或方法执行完毕时,它的所有局部变量都将被释放。这使得weak引用不能用于局部变量,因为局部变量需要阻止对象被释放。

weak 和 strong 的区别

  • strong:strong引用是一种普通的引用,它会阻止对象被释放。
  • weak:weak引用是一种特殊的引用,它不会阻止对象被释放。

weak 和 assign 的区别

  • weak:weak引用是一种特殊的引用,它不会阻止对象被释放。
  • assign:assign引用是一种直接的引用,它不会阻止对象被释放。

strong引用 :强引用是指一个对象持有另一个对象的引用,并且这个引用会阻止被引用的对象被释放。
weak引用 :弱引用是指一个对象持有另一个对象的引用,但是这个引用不会阻止被引用的对象被释放。当被引用的对象被释放时,弱引用也会自动被释放。
assign引用 :assign引用是一种直接的引用,它不会阻止被引用的对象被释放。当被引用的对象被释放时,assign引用仍然存在,但是它指向的对象已经不存在了。

弱引用通常用于那些不需要阻止对象被释放的情况,例如委托、观察者和计时器。强引用通常用于那些需要阻止对象被释放的情况,例如属性和局部变量。assign引用通常用于那些不需要阻止对象被释放,但又需要直接访问对象的情况,例如函数参数和方法返回值。