delegate属性为什么要用weak修饰?
2018-12-23 本文已影响0人
丹丹十个胆小鬼
1、避免循环引用
平常使用代理时,只是关注的不能造成循环引用,用strong修饰就会造成循环引用吗?答案是可能会。
就拿UITableviewController
来说,控制器拥有tableView
对象(控制器强引用了tableView
),tableView
有delegate
属性,UITableViewController
又要监听tableView的代理,如果delegate
属性使用的strong
,tableView
又强引用了UITableviewController
控制器,就造成了循环引用,使用weak就不会造成这个问题。
self.tableView.delegate = self;
QQ20181222-211940@2x.png
2、不让delegate
属性跟外界对象的生命周期相关联
如果用strong
修饰,会对监听代理的对象造成强引用,从而对该对象的生命周期产生影响。
现在项目中有一个FLDog
的类,头文件如下
@class FLDog;
@protocol FLDogDelegate <NSObject>
@optional
- (void)dogEat:(FLDog *)dog;
@end
@interface FLDog : NSObject
/** delegate*/
@property (weak, nonatomic) id<FLDogDelegate> delegate;
@end
还有一个FLPersion
类,
@implementation FLPersion
- (void)dealloc {
NSLog(@"FLPersion dealloc!!");
}
@end
在控制器中让persion
对象成为dog
的代理,
- (void)viewDidLoad {
[super viewDidLoad];
FLPersion *per = [[FLPersion alloc] init];
self.dog = [[FLDog alloc] init];
self.dog.delegate = per;
}
运行程序,viewDidLoad
方法执行完毕,per
对象dealloc
方法执行,对象被销毁(没有强引用),这个是正常的情况,但是如果把代理改成strong
修饰的话就不一样了,viewDidLoad
方法执行完,per
对象是不会销毁的,因为per
被dog
的delegate
属性强引用了,是释放不了的。