It gets scary out there sometimes. During my freelance career I’ve worked at a lot of different companies and have seen such coding horrors as you cannot imagine. So I thought I’d start immortalising some of them – so that we can all learn better coding practices, by looking at the bad.
Starter for 10 – What’s wrong with this picture?
public function doSomething(stuff:String):void { var newPixels:BitmapData = new BitmapData(someUint, someUint, true, 0); someBlitUtil.blitStuffTo(newPixels, stuff); someBitmap.bitmapData = newPixels; }
Did you spot the fubar? It’s not an obvious one.
This code potentially replaces a Bitmap’s BitmapData, without first explicitly disposing any existing BitmapData.
I see this kind of thing quite often and it’s the source of many a memory leak. AVM2 isn’t that great at dealing with this kind of situation and there’s a crucial difference between GC cleaning up out-of-scope objects for you and things like BitmapData: GC will reclaim the memory associated with objects ‘when it feels like it’, whereas explicitly calling the ‘dispose’ method of a BitmapData will immediately give you back that memory.
In the case of platforms with hardware accelerated graphics (such as mobile or set top box), the memory associated with the pixel data itself (video memory) will be reclaimed immediately.
The lesson?
Don’t make more work for the Garbage Collector when you can avoid it.