美文网首页
delegate属性为什么要用weak修饰?

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

作者: 丹丹十个胆小鬼 | 来源:发表于2018-12-23 06:57 被阅读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属性强引用了,是释放不了的。

    相关文章

      网友评论

          本文标题:delegate属性为什么要用weak修饰?

          本文链接:https://www.haomeiwen.com/subject/eluwkqtx.html