跳到主要内容

常见的Delegate属性都用是week而不是retain/strong?

参考答案:

在Objective-C和Swift中,delegate属性通常用于实现委托模式,这是一种设计模式,允许一个类的对象在其内部状态改变时通知其他对象,并且允许其他对象对这些变化做出响应。在Objective-C中,delegate属性通常被声明为assign而不是retain(在ARC之前的时代)或weak(在ARC引入之后)。在Swift中,它通常被声明为weak。这里有几个原因:

  1. 避免循环引用:委托模式通常涉及两个对象之间的紧密关系,其中一个对象是另一个对象的委托。如果delegate属性是retain(或strong在Swift中),那么这两个对象就会相互持有对方,导致它们都无法被释放,从而造成内存泄漏。通过将delegate属性设置为weak(或assign在ARC之前),可以确保委托对象不会强引用委托者,从而避免循环引用。

  2. 避免野指针:如果委托对象在委托者之后被释放,而委托者仍然持有一个指向已释放对象的强引用,那么这个引用就会变成一个野指针。野指针可能导致程序崩溃或不可预测的行为。使用weak(或assign)可以确保当委托对象被释放时,委托者的delegate属性会自动设置为nil,从而避免野指针问题。

  3. 语义清晰:将delegate属性声明为weak(或assign)也有助于清晰地表达设计意图。它表明委托者不应该拥有其委托对象的生命周期,而是应该允许委托对象在其不再需要时被释放。

需要注意的是,在Swift中,由于class类型的引用默认就是强引用(strong),因此为了避免循环引用,我们通常需要将delegate属性显式地声明为weak。而在Objective-C中,由于ARC之前的版本使用retainrelease进行内存管理,因此delegate属性通常被声明为assign以避免增加引用计数。在ARC引入之后,Objective-C也推荐使用weak来声明delegate属性。