Block--方便而危险
2017-01-05
编程
Context
Block真的很好用对不对?记得很早以前用ASIHttp来做网络请求的时候,得用delegate,然后每次请求的
delegate回调中都要做一下判断,才能知道这个回调是回应了具体哪一次请求,这还是蛮麻烦的.
不过Block出现了,对网络请求的response操作,就可以直接写在block中,不用去判断这个response谁否对应与当前这个request.
除了网络请求,Alert的回调啊,asyncsocket啊,之类的异步操作,用了block都特别的方便.
Situation
然而,有一天我们在炫轮iOS端的DIY界面中发现了一个bug,而这个bug预示着,
我有实例没有成功释放.
Reason
于是我就一行一行的找,感觉没有什么地方出现.但是我发现了一个现象:
我在使用SCLAlertView了之后,就出现了这个bug,所以我就重点查看SCLAlertView的相关代码,
经过排查,我觉得问题只能出现在dismissBlock上.查看了dismissBlock的声明代码,他是个strong~
我想,这里应该是出现了一个循环引用…block中的内容,在声明的时候,会copy一份当时的数据.当AlertView 消失的时候,
调用了dismissBlock,然而,dismissBlock中的内容有引用当前的ViewController,所以.
他们互相引用了!
所以只能在dismissBlock的最后加一行,把这个dismissBlock设置为nil.解决了~
End
这次要不是遇到了这个坑,说不定永远也不会去仔细看Block实现的原理~
关键就是这个copy,所以在block中如果引用了(强引用了该block的)类,就一定要注意,检查会不会出现循环引用!