Tuesday Four AM
Tuesday Four AM

Reputation: 1276

Keep memory clean and kill ViewControllers

I've noticed that as I navigate across my iOS app memory stack grows with each opened viewController.

My navigation is based on segues and I do self.dismiss() before performing each segue. Still, it looks like viewControllers stack in memory.

How can I avoid this?

In Android finish() kills the Activity (in most cases), so I need an alternative in the iOs.

Upvotes: 1

Views: 1554

Answers (2)

danypata
danypata

Reputation: 10175

The memory issue can have several causes and not necessarily a UIViewController. In order to find and solve the issue you have to reduce the scope of the issue from "app" to a certain screen or even class. Then you can check the code and try to figure out where's the suspicious code.

Solving this issue is not a straight up task and there's no "how to fix memory issue for my app" tutorial, you'll have to check your code and compare with potential causes of memory leaks.

Also you'll have to be careful for false positives of memory leaks. Here are some steps I follow when I suspect a memory issue.

Navigate trough the app "till the end", then go back to "home screen", if the memory drops, all good.

If the memory doesn't drop, I do the same navigation several times, if the memory increases with the same step (more or less but close) then there's an issue. If the memory doesn't increase (maybe just a bit, several kb) then it's ok, it means there are some assets cached in memory (images, files, etc). But you will need a way to test this scenario too.

Now we are back to the "memory increased again almost the same as first time", now I do a clean run, and take each screen at a time, I just open the screen go back (dismiss/pop the controller) and observe, if the memory drops then that's not the screen that leaks. When I find the screen that increases the memory and never goes back:

  • check if the controller is passed as a reference to other objects that won't be deallocated (singleton classes or other, depends on the app).
  • check if the controller is sent as "delegate" to any other classes and if those delegates are correctly defined (strong delegates are a biiiiig issue).
  • if all of the above are ok, then I'll simply comment all the code that performs any work and try again. If commenting the code doesn't drop the memory(this happens rarely) then the screen is not the right one.
  • if the memory drops after commenting the code, I start de-commenting bits of the code and run again, until you'll find the piece of code that creates you issues.

One thing to keep in mind, you have to be patient while investigating memory issues, and to be honest, sometimes you have to be lucky too.

Upvotes: 5

Josh Hrach
Josh Hrach

Reputation: 1376

Per documentation on UIViewController.dismiss:

Dismisses the view controller that was presented modally by the view controller.

So calling this would dismiss any view controller shown modally. Based on your question, I have to assume that your segues are push segues and not modal, otherwise you'd be seeing your view controllers disappear.

Your 'view controller stack' might be with regards to the navigation stack on a UINavigationController. If so, then those view controllers remain in memory, as when a view controller is popped off the stack (ie: user swipes from left edge of screen, or hits "Back" in the nav bar), the previous view controller appears.

Without more information on how you're presenting your view controllers or building your navigation, I don't think you'll be able to get more answers.

Upvotes: 1

Related Questions