Search code examples
iosobjective-cxcodeinstruments

Xcode debugging / Instruments: See all pointers to an object


I just started working on a relatively complex project, and have discovered a bug. When the user logs out, the view controllers are still allocated behind the login view controller. They continue responding to rotation events, etc. I have set the controller to nil upon logout, but it's still responding, which indicates that some other object still has a pointer to it. (This project has ARC enabled.)

Pre-ARC I could likely solve this by overriding retain:

- (id) retain
{
    // Break here to see who is retaining me.
    return [super retain];
}

How can I use the Xcode debugging tools to select an object and list all the other objects that point to it? Is there a better approach than simply hunting through all the code?


Solution

  • The Instruments Heapshot Analysis tool was the best thing I could find for this purpose. This article provides a more complete tutorial, but the basic steps are:

    1. Select Product -> Profile. Choose the Allocations Instrument.
    2. On the left, press the Mark Heap button before/after significant events. In my case, this was before login, after login, and after logout.
    3. Search through the Heapshot for the class you're looking for.
    4. Press the disclosure triangle to see its memory address(es).
    5. Press the arrow to the right of a memory address to see its responsible caller (it appears in the rightmost column.)

    If someone else writes up a more thorough explanation, or can offer any related lldb commands, I'm happy to mark your answer as correct.