常见的Delegate属性都用是week而不是retain/strong?
在Objective-C和Swift中,delegate
属性通常用于实现委托模式,这是一种设计模式,允许一个类的对象在其内部状态改变时通知其他对象,并且允许其他对象对这些变化做出响应。在Objective-C中,delegate
属性通常被声明为assign
而不是retain
(在ARC之前的时代)或weak
(在ARC引入之后)。在Swift中,它通常被声明为weak
。这里有几个原因:
-
避免循环引用:委托模式通常涉及两个对象之间的紧密关系,其中一个对象是另一个对象的委托。如果
delegate
属性是retain
(或strong
在Swift中),那么这两个对象就会相互持有对方,导致它们都无法被释放,从而造成内存泄漏。通过将delegate
属性设置为weak
(或assign
在ARC之前),可以确保委托对象不会强引用委托者,从而避免循环引用。 -
避免野指针:如果委托对象在委托者之后被释放,而委托者仍然持有一个指向已释放对象的强引用,那么这个引用就会变成一个野指针。野指针可能导致程序崩溃或不可预测的行为。使用
weak
(或assign
)可以确保当委托对象被释放时,委托者的delegate
属性会自动设置为nil
,从而避免野指针问题。 -
语义清晰:将
delegate
属性声明为weak
(或assign
)也有助于清晰地表达设计意图。它表明委托者不应该拥有其委托对象的生命周期,而是应该允许委托对象在其不再需要时被释放。
需要注意的是,在Swift中,由于class
类型的引用默认就是强引用(strong
),因此为了避免循环引用,我们通常需要将delegate
属性显式地声明为weak
。而在Objective-C中,由于ARC之前的版本使用retain
和release
进行内存管理,因此delegate
属性通常被声明为assign
以避免增加引用计数。在ARC引入之后,Objective-C也推荐使用weak
来声明delegate
属性。