Knowing where retain cycles are and removing them

僤鯓⒐⒋嵵緔 提交于 2019-11-27 07:29:44

问题


I was wondering if there was an easy way (or at least a way) to find out where retain cycles exist in your program. Also, if I then know where these retain cycles exist, depending on their types (e.g. variable or closure), how do I make them weak. I need to stop all retain cycles with self (my GameScene) so that it deallocates when I don't need it anymore and I want to restart it.

Any tips, advice, answers, and feedback would be greatly appreciated (and providing specific code and examples would be preferred). Thank you.

Edit: @Sweeper's answer was just what I was looking for. If you're having the same issue his answer will help. Thanks @Sweeper!


回答1:


If you are using Xcode 8 or above, you can use the memory graph thingy to see what object holds a reference to what object.

To see the memory graph, first build and run your app with Xcode. When you want to check whether all the instances you created are discarded properly, go to this tab on the left pane:

Then press the button on the right there:

After that, select the bottom-most option - View Memory Graph Hierarchy:

Now it will show you all the objects that are in memory:

In my case, I have a GameSystem object, 6 ButtonNode objects and a few others. You'll notice that there is a little ! beside the GameSystem object. That means this object is leaked. Also, GameScene should not be in memory anymore because the current scene is TitleScene. Let's see what is retaining it by clicking on the instance:

Now you can clearly see that it is retained by a closure!

That is how you use the memory graph to see where you should put weak-references and avoid retain cycles.



来源:https://stackoverflow.com/questions/41660486/knowing-where-retain-cycles-are-and-removing-them

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!