美文网首页iOSiOSiOS
不用strong->weak的方式来避免循环引用

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

作者: 阿召 | 来源:发表于2015-07-06 11:19 被阅读416次

    循环引用。我们很多人肯定都犯过这样的错误,尤其是现在 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时,记得想起这个建议

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

    相关文章

      网友评论

        本文标题:不用strong->weak的方式来避免循环引用

        本文链接:https://www.haomeiwen.com/subject/pupyqttx.html