不用strong->weak的方式来避免循环引用

循环引用。我们很多人肯定都犯过这样的错误,尤其是现在 blocks/closures 在iOS开发中越来越流行。 你可能已经知道,在block里引用任何对象都将强引用这个对象,如果这个对象,copy/retain这个block,这样就会导致循环引用,除非你手动把这个block置nil,否则就会引起内存泄露。

当然我们有众所周知的解决办法来避免这个问题(用__weak来弱引用)但是在我看Facebook 开源的Pop工程时,我发现一个可代替的方案

PopCustomAnimation.h

<pre><code>
/**
@param target The object being animated.
Reference the passed in target to help avoid retain loops.
*/
typedef BOOL (^POPCustomAnimationBlock)(id target, POPCustomAnimation *animation);

</code></pre>

因为你总是可以得到一个这些参数的隐含引用(通过block的局部变量获取)所以换句话说,block中的参数是多余的,但是它非常有用,因为现在你可以用这些参数而不是在block外声明一个weak引用在用它。

用这种方式你就可以避免循环引用,也不用非得用strong->weak的方式了
所以下次你在设计API的时候含有block或closure时,记得想起这个建议

本文翻译自这篇文章,水平有限,欢迎大家吐槽指正

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容