ios - 通过协议传递自我会导致内存泄漏吗?
问题描述
我很难理解这个
假设我有一个自定义视图,其中包含另一个类(视图控制器)使用的协议
protocol MyViewDelegate : AnyObject {
func parentNeedsToTakeAction(sender: MyView)
}
class MyView : UIView {
...
weak var delegate : MyViewDelegate?
....
func initiateCallBack(){
delegate?.parentNeedsToTakeAction(self)
}
}
并且视图控制器符合该视图的委托
在我将 self 传回 VC 之前,我知道 VC 持有对视图的强引用,而视图只持有对 VC 的弱引用(通过委托)
但是之后会发生什么?视图的 ARC 现在是 2 还是仍然是 1,VC 持有 1 或 2 个对该视图的强引用?
如果在 VC 中我继续采取行动,然后从它的视图中删除发送者(子视图),子视图是否会从内存中释放?
解决方案
只有当引用的接收者在一段时间内保留该引用时,才会导致内存泄漏。当您调用 时delegate?.parentNeedsToTakeAction(self)
,该方法会parentNeedsToTakeAction
运行非常短的时间然后结束。随着时间的推移,不会保留任何引用self
,因此没有泄漏的危险。
推荐阅读
- java - 实现 Spring ThreadPoolTaskExecutor 并提供最佳配置值
- python - 用于常微分方程分岔分析的 Python 库或包
- python-3.x - 加载 csv 并删除 \r\n python
- r - 当我尝试使用 rvest 抓取 mlb.com 交易时没有返回任何内容
- java - 为什么经过几次迭代后 Bufferedimage 等于 null?
- regex - 从文本中提取文本(单词)和 IP 地址
- jooq - 有没有办法生成带有内联和索引参数的查询字符串?
- ios - 如何实现平移手势以折叠展开的 collectionview 单元格?
- javascript - 如何使用 Axios 向 POST 请求添加数据?
- c# - 通过 Startup 类启动客户端控制台应用程序