Zuikyo / ZIKRouter

Interface-oriented router for discovering modules, and injecting dependencies with protocol in Objective-C and Swift.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

内存泄露问题 ,有两个场景

manajay opened this issue · comments

1. 侧滑退出, 没有直接调用 removeRouter , 导致控制器释放, 但是 presenter 之类的没有释放

2. 主要控制器 添加子控制器,的视图, removeRouter 时 只移除 主控制器的, 导致子控制器的控制器以及 presenter 之类的无法释放

commented

你说的这两个场景在 ZIKViperDemo 里都有,参考 ZIKEditorViewController。测试并没有内存泄露。
退出页面可以通过任意方式,不一定非要使用 removeRouter,removeRouter 只是做了一层封装,让使用者不用判断用哪种方式移除界面。
presenter 没有释放应该是 presenter 和某个对象产生了循环引用,和 ZIKRouter 无关,可以在泄露时用Xcode 的 Debug Memory Graph功能查看 presenter 当前被谁引用了。
可能是你在 router 里又引用了 presenter ?

检查了一下,发现手动 removeRouter 后,没有内存泄露, 但是侧滑会发现 有奇怪的东西引用视图
image

视图就释放不了, 其他的presenter 也就释放不了

commented

你的view 是 UIView 还是 UIViewController ?看看是不是 remove 时在自定义的 router 里做了什么特殊操作。
Debug Memory Graph上每个节点的小箭头还可以点击展开,看看左下角的小箭头指向了什么对象。

contentView 作为 一个主控制器的 子控制器还是 自定义的子视图 我都尝试了, 正常 主控制器释放了,但是 这个 contentView 还是没有释放, 目前还没有查到原因, 只能在 主控制器dealloc 时 ,主动调用 contentView的 removeRouter解决这个问题了

正常的 持有逻辑 我也理清了一下, 怎么看也没问题, 包括 prepare的 config 中 block 也 weak dance, 没有循环引用
image

今天我再检查一下.

commented

如果 destination 是一个 UIView,那 removeRoute 只是简单地调用了 removeFromSuperview。你可以试试直接调用 removeFromSuperview 比较一下。

如果 destination 是一个 UIView, 那么使用 makeDestination , 将其添加到 superView 上, 那么都有谁会对这个 destination 强引用呢?

commented

router 内部对 destination 只有 弱引用,destination 添加到 superview 上后,应该只有 superview 会对其强引用。
还是再看看Debug Memory Graph的提示吧。