delegate属性为什么要用weak修饰?

2018-12-23  本文已影响0人  丹丹十个胆小鬼

1、避免循环引用

平常使用代理时,只是关注的不能造成循环引用,用strong修饰就会造成循环引用吗?答案是可能会。
就拿UITableviewController来说,控制器拥有tableView对象(控制器强引用了tableView),tableViewdelegate属性,UITableViewController又要监听tableView的代理,如果delegate属性使用的strongtableView又强引用了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对象是不会销毁的,因为perdogdelegate属性强引用了,是释放不了的。

上一篇下一篇

猜你喜欢

热点阅读