delegate的循环引用小计

ViewController.m

首先遵循UIScrollViewDelegate

UIScrollView *scrollerView = [[UIScrollView alloc] init];

scrollerView.frame = CGRectMake(100, 100, 200, 200);

scrollerView.backgroundColor = [UIColor orangeColor];

scrollerView.contentSize = CGSizeMake(300, 300);

scrollerView.clipsToBounds = NO;

[self.view addSubview:scrollerView];

scrollerView.delegate = self;



当rootViewController指针指向controller -> 控制器死不掉

controller有一个view属性 -> view属性强引用了view对象(strong) ->保证了只要控制器在,view就在

view有一个属性是subviews -> 这个属性是一个数组对象(强引用)

将scrollerView添加到view上,其实就是将scrollerView放进数组对象中,假如是数组的第0个位置,就是说数组的第0个位置保存着scrollerView的内存地址,相当于数组中第0个位置有个指针指向了保存着scrollerView的内存地址,即数组强引用了这个scrollerView对象

UIScrollView 有个属性叫delegate,一般这个属性是控制器,假如是强引用,那么就导致了循环引用,导致最后谁都释放不了 ,原因: 即使将来rootViewcontroller不再是当前控制器,那么就要释放当前的控制器,可是此时UIScrollView的对象的属性在强引用着这个controller,导致无法释放controller,导致controller的view属性无法释放,导致scrollerView无法释放,导致controller无法释放

所以代理用weak,弱引用,那么控制器被销毁的时候,就没有强指针指向它,那么它就会被销毁,那么它指向其他的指针也就被销毁,view没有强指针,即view被释放,然后subViews数组被释放,然后scrollerView被释放

代理的规律:用来监听控件的某些行为,是id修饰,但是一般是controller,也可以是其他任意对象,用弱指针修饰防止循环引用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,211评论 30 472
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,014评论 0 7
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,759评论 0 4
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...
    失忆的程序员阅读 504评论 0 1
  • 一 昨天被一篇名为《我曾经养了一条黑狗,它名字叫抑郁》的文章刷屏了,文章主要讲述了作者曾经一段抑郁时期的心理活动。...
    疯岩疯语sun阅读 203评论 0 0