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

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

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

PopCustomAnimation.h


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

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

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

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

你可能感兴趣的:(不用strong->weak的方式来避免循环引用)