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

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属性强引用了,是释放不了的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容