delegate修饰为什么用week

为什么用week而不用strong,原因是为了防止循环引用

如果用strong的话,假设在B中添加A类的delegate,B就会持有(强引用)A的对象,A的delegate会持有(强引用)B,就造成了循环引用。

例如在B中

@property (nonatomic, strong) A *a; B类中
self.a.delegate=self又对B强引用,使B的retainCount + 1
@property (nonatomic, weak) id<ADelegate>delegate;A类中
造成循环引用,
B类对象被释放的时候,delegate仍然持有B对象,导致B和A都不能被释放

用assign避免了这个问题,

self.a.delegate=self 在这一步中

因为assign是单纯的拷贝所赋值变量的值,即进行简单的赋值操作,delegate不持有B,只是保留了B对象的指针的值,不会使引用计数加1。但是如果当B被销毁的时候,引用计数变成0但并不意味着被销毁,delegate不会跟着销毁,仍保存着之前对象的值,就成了野指针,造成内存泄露。当再向delegate发消息的时候,就会crash。

用week解决了这个问题,当B对象被销毁的时候,week修饰的delegate也会自动置为nil(销毁),这时再向nil发送消息,不会crash,OC可以向nil对象发送消息

 

posted @ 2017-05-03 09:24  ddavidXu  阅读(668)  评论(0编辑  收藏  举报