Block篇-类中带Block的方法为什么不会循环引用.

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18683985/article/details/83106083

说到Block,大家最头疼的事情肯定就是循环引用了.
但是,用到带Block的类方法的时候却并没有被循环引用所困扰,那又是为何呢.
下面,用UIView的块动画来举个例子.

	+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);

比如我们在控制器里面使用了这个块动画.一切都很完美,是吧.好.我们现在打开Block.在animations里面写一点类似下面的代码.

	self.xxx.backgroundColor = [UIColor redColor];

然而.我们销毁该视图(比如控制器pop了).发现dealloc还是走的.那么,这是为什么呢.
UIView实例强引用了self.xxx是没有问题的.self强引用了xxx也是没问题的.但是self,没有强引用UIView.那么,不能形成闭环.也就没有循环引用了.

那什么时候会循环引用呢.比如xxx有个block的属性.self.xxx.block = {}给他赋值.执行以下就会发现循环引用了(前提是在{}内使用了self.xxx).因为self引用了xxx.xxx引用了self.闭环了.

猜你喜欢

转载自blog.csdn.net/qq_18683985/article/details/83106083