不做从strong 到weak 的转换,如何避免循环引用
2015-07-09 22:48
218 查看
本文翻译自 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的时候,心里想着这个小技巧。
我们肯定被循环引用咬过至少一口。 特别是在现代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的时候,心里想着这个小技巧。
相关文章推荐
- RecyclerView介绍
- LeetCode之Largest Rectangle in Histogram
- 看懂UML类图和时序图
- iOS 多线程技术由浅深入(学习笔记)
- ECC加密算法入门介绍
- EHCache入门系列(四)–分布式缓存集群环境配置
- 奔跑中的2015:Linux运维学习八大禁忌
- Socket模拟客户端与服务器
- poj 2192 Zipper
- SpringMVC
- EHCache入门系列(三)–在Hibernate 中运用EHCache
- 我们的java基础到底有多差 一个视频引发的感想
- 我们的java基础到底有多差 一个视频引发的感想
- 南阳oj 题目113 字符串替换
- UIView复习day1
- 【再认真理解】1003. Emergency (25) Dijastra最优路径算法修改版求解
- leetcode 101 Symmetric Tree
- NFA到DFA的转换
- 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
- leetcode 101 Symmetric Tree