2 Replies Latest reply: Apr 2, 2012 6:52 AM by FLAdude RSS

    iOS and Memory Leaks

    FLAdude Community Member

      How 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#AddressSizeResponsible LibraryResponsible Frame
      NSCFString60< multiple >960QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154a73f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154a73f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154a73f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee4016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee4016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee4016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee4016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee4016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee3016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee3016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee3016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee3016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549ee3016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d98016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d98016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d98016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d98016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d98016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d6d016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d6d016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d6d016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1549d6d016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b80016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b80016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b80016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b80016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b07016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b07016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b07016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b07016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1548b07016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154810f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154810f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154810f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154810f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154810f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x154810f016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1547ccd016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1544dfd016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1544dfd016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1163734016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1163733016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1163733016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1163733016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1162652016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1162652016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1162652016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1162652016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1161561016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1161561016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0x1161561016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xda84d016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xda84c016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xda84c016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xd905c016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xd7a15016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xd6792016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xd6792016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xd6792016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      NSCFString
      0xd3167016QuartzCoreCA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)
      GeneralBlock-164< multiple >64libGLProgrammability.dylibstd::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&)
      GeneralBlock-16
      0x1160c70016libGLProgrammability.dylibstd::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&)
      GeneralBlock-16
      0x1160c70016libGLProgrammability.dylibstd::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&)
      GeneralBlock-16
      0x1160c70016libGLProgrammability.dylibstd::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&)
      GeneralBlock-16
      0x1160c70016libGLProgrammability.dylibstd::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&)
      GeneralBlock-163< multiple >48libGLProgrammability.dylibGetSymbolTable(int)
      GeneralBlock-16
      0xd638f016libGLProgrammability.dylibGetSymbolTable(int)
      GeneralBlock-16
      0xd638f016libGLProgrammability.dylibGetSymbolTable(int)
      GeneralBlock-16
      0xd638f016libGLProgrammability.dylibGetSymbolTable(int)
      GeneralBlock-16
      0xd8dca016libGLProgrammability.dylibstd::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<TSymbolTableLevel**, std::vector<TSymbolTableLevel*, std::allocator<TSymbolTableLevel*> > >, TSymbolTableLevel* const&)
        • 1. Re: iOS and Memory Leaks
          meetshah4288 Community Member

          Hi FLADude,

           

          Is it possible for you to share the action script code corresponding to which you are getting this leaks as reported in Instruments ?

           

          Thanks,

          Meet

          • 2. Re: iOS and Memory Leaks
            FLAdude Community Member

            As I said in the post, the stuff reported in leaks doesn't match any of my variable or function names. It just shows generic stuff for the 'Responsible Library/Frame', such as GetSymbolTable(int) or QuartzCore. I didn't name anything in my code by those names. Quartz, I believe, is the stuff used to draw vectors on iOS, and the other things like 'TSymbolTableLevel' are not names I used either.

             

            So I am not sure if this is my code leaking memory or the AIR rumtime itself leaking memory, or how you would go about interpreting Instruments reports on an AIR based app. My theory is that any stuff not garbage collected and leaked within the AIR runtime should be contained within the runtime wouldn't show up in Instruments as a leak, so I don't know if there is anything I can do within my code to make the 'leaks' dissappear or not.

             

            There is a ton of stuff going on in my code, events and functions calling or initiating other functions and such, so it isnt as simple as just looking at what code would be fired at the time the leak shows up to figure out what piece of code the leak occured at.