本文翻译自 http://iosdevtips.co 网站
我们肯定被循环引用咬过至少一口。 特别是在现代iOS开发中,block 跟闭包 增长的越来越快。 你可能已经知道了,从一个block中引用任何的外部对象,会导致引用,如果这个外部对象正好拷贝或者引用了这个block ,那么就会导致循环引用。那么就会导致内存泄漏,除非人工的把 block 置空。
有一种广为人知的方法,去避免这个问题。那就是用 weak引用, 但是我在看 Fackbook 的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中总是能够 显式的引用到任何的外部对象。但是它是非常有用的,因为现在你能够使用参数,而不是做一个weak 的引用。
这种方法能够避免你所必须做的 从 strong -> weak 的 跳舞。
所以你下次设计一个拥有block或者闭包的API的时候,心里想着这个小技巧。