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;


delegate的循环引用小计_第1张图片


当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,也可以是其他任意对象,用弱指针修饰防止循环引用

你可能感兴趣的:(delegate的循环引用小计)