Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find where object is retained with ARC

I have an object that is being retained more than necessary (most likely due to a property that is strong instead of weak). Big codebase, so it's hard to find where.

How can I find all the lines in which this object is being retained when using ARC?

If I weren't using ARC I guess I could simply override retain and check from where it's called. Can I do something similar with ARC?

like image 841
hpique Avatar asked Sep 04 '12 11:09

hpique


2 Answers

To track growth of an application, Heapshot Analysis has proven very effective. It will capture both true leaks and accretion of memory where the allocations are not accounted for by leaks.

You can see all of the retain/release events, and their backtrace, using the Allocations instrument. Hit the little (i) button on the Allocations instrument and turn on "Record reference counts". Turning on "Only track active allocations" reduces the amount of data collected by Instruments, making it snappier (and dead allocations aren't really useful in this context, but can be in others).

With that, you can dive into any allocation (by clicking on the right-arrow in the address field), see all the retain/release events and see exactly where they occurred.

enter image description here

like image 199
bbum Avatar answered Oct 01 '22 10:10

bbum


I managed to find the offending retain by doing the following:

  1. Temporarily add -fno-objc-arc to the object class Compiler Flags to disable ARC for that class.
  2. Temporarily override retain (just call super) and put a breakpoint on it.
  3. Debug and check the call stack each time retain is called.
like image 37
hpique Avatar answered Oct 01 '22 10:10

hpique