方法四:将当前self作为block参数传入,例如:
[self.myDownloader downloadWithBlock:^(NSData *onlineData, NSError * _Nullable error, BOOL succeeded, XXXViewController* vc){ if(succeeded){ //download success vc.data = onlineData; } else{ //handle error } }];这种情况一般很少出现,因为下载器通常作为第三方提供的API,通常参数不会有当前控制类。所以这种情况只能用在自定义block当中使用。
总结在ARC环境下开发,我们用到的一般都是堆Block或全局Block,当捕获外界变量时为堆Block,否则为全局Block
Block主要用于代码回调以及异步操作以降低代码分散程度。
Block在捕获变量时很容易造成循环引用,导致内存泄漏。在不确定调用第三方API是否在最后将block属性置为空,或者没有使用属性而是临时变量作为调用block,所以在不破环封装性的原则下,将其视为未处理,然后在自己的代码中使用waekSelf和strongSelf方式来进行当前self的属性进行操作,这样就实现了在环节[3]中打破强引用环。