iOS and Memory Leaks
FLAdude Mar 31, 2012 12:55 PMHow do you ensure that AIR on iOS does not leak memory and how do you trace 'leak' alerts to their source? Below is a table with a bunch of leak data, but I don't see how you could trace it back to your code and find the leak. I have tried making sure variables are de-referenced when finished with them, and event listeners are either removed or weak-referenced(allows objects to be garbage collected when the listener is the last thing referencing them).
I would like to get any and all leaks out of my app so that I can submit it to the App Store.
Edit: The leak table is from what it showed in the Apple 'Instruments' tool on my Mac when scanning the app running on my phone.
Edit 2: I'm not sure how to interpret this leak data from Instruments. My app is running within the 'captive' AIR runtime on the iPhone, so theoretically I would think that any leaks in my app would stay allocated in the AIR captive runtime and not show up here. I thought maybe I should be monitoring the 'Allocations' section of the tool for notable changes in the total allocations since un-garbage-collected stuff would stay contained within AIR. If it is showing leak data in the 'leaks' section, does that mean the AIR runtime itself is leaking? None of the functions or libraries or identifiers or whatever they are listed in the leak data match stuff that I wrote, so maybe they are parts of the 'AIR engine'.
| Leaked Object | # | Address | Size | Responsible Library | Responsible Frame |
| NSCFString | 60 | < multiple > | 960 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) |
| NSCFString | 0x154a73f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154a73f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154a73f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee40 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee40 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee40 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee40 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee40 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee30 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee30 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee30 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee30 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549ee30 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d980 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d980 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d980 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d980 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d980 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d6d0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d6d0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d6d0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1549d6d0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b800 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b800 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b800 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b800 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b070 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b070 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b070 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b070 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1548b070 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154810f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154810f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154810f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154810f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154810f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x154810f0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1547ccd0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1544dfd0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x1544dfd0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11637340 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11637330 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11637330 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11637330 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11626520 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11626520 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11626520 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11626520 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11615610 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11615610 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0x11615610 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xda84d0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xda84c0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xda84c0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xd905c0 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xd7a150 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xd67920 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xd67920 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xd67920 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| NSCFString | 0xd31670 | 16 | QuartzCore | CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) | |
| GeneralBlock-16 | 4 | < multiple > | 64 | libGLProgrammability.dylib | std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&) |
| GeneralBlock-16 | 0x1160c700 | 16 | libGLProgrammability.dylib | std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&) | |
| GeneralBlock-16 | 0x1160c700 | 16 | libGLProgrammability.dylib | std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&) | |
| GeneralBlock-16 | 0x1160c700 | 16 | libGLProgrammability.dylib | std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&) | |
| GeneralBlock-16 | 0x1160c700 | 16 | libGLProgrammability.dylib | std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&) | |
| GeneralBlock-16 | 3 | < multiple > | 48 | libGLProgrammability.dylib | GetSymbolTable(int) |
| GeneralBlock-16 | 0xd638f0 | 16 | libGLProgrammability.dylib | GetSymbolTable(int) | |
| GeneralBlock-16 | 0xd638f0 | 16 | libGLProgrammability.dylib | GetSymbolTable(int) | |
| GeneralBlock-16 | 0xd638f0 | 16 | libGLProgrammability.dylib | GetSymbolTable(int) | |
| GeneralBlock-16 | 0xd8dca0 | 16 | libGLProgrammability.dylib | std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&) |

