ActionScript 3.0 :: Trace Object References For Garbage Collecting?
Oct 12, 2009
I'm trying to get my head around optimising AS3 code and clearing things out for garbage collection.
I understand that each time an item is referred to in the code it has its reference count increased by one, so I was wondering if there is a trace option I can use to see how many references each of my objects has?
I can then see where things are getting left behind (if they are) and where I can make optimise better.
I think it would help me work out several issues if I was able to do this
I was thinking about Flash GC the other day and came up with a question about how reference counting would work in the following 4 class scenario (assume GuiMain is the movie's document class):
after strolling through the internet looking for garbage collecting of dynamic movieclips i conceded and justified to myself i should make a forum post.I'm making a small game, with many many explosions. Explosions are random swfs which i cache before using them. Problem is that although i did everything to make them ready for garbage collecting, they seem to overflow the memory.my code:
the last line, 'e.target.parent=null ', is the way i know how to make movieclips ready for garbage collecting. But if i uncomment the line, I get this error:
Code: ReferenceError: Error #1074: Illegal write to read-only property parent on example03_fla.MainTimeline. at Explosions/::doneHandler() at flash.events::EventDispatcher/
example03_fla is the timeline of the supposed movieclip i'm trying to delete, not the document fla.
What's necessary to do when removing an object to make sure there are no memory leaks? Do you have to remove all children? Or just remove all event listeners? Or both?
I'm currently working on a game where every "Step" - defined by a global time modifier - everything on screen calculates where it's next position will be, then uses tweenlite to animate itself to that location. This program runs for about 10 seconds before it eats 100% of my CPU. iMac i5 quad core, so it's not the hardware.
The problem is specifically in the following snippet, and the peculiar thing is if I teleport everything to it's next position (i.e. don't tween it there) the CPU is stable at 6% (where flash IDE consumes 4%). Does anyone know why these tweens are just stacking and stacking and never garbage collecting? (This is what I assume the problem is, as I can't find another explanation as to why the problem only exists when i TWEEN to the next location)
I think I'm still trying to understand Dependency Injection and the role of the DI container. If DI means a lower level component depends on a higher level one, and there's no circular reference, won't that object get garbage collected? As I see garbage collection (mark-and-sweep), it keeps only the objects that can be traced with a chain of references starting from the program root.
Since I'm having difficulty explaining myself, here are two UML diagrams, which present conflicting views of Dependency Injection, as I see it: My original interpretation of DI
The DI Container injects components with their required references, and they each store a reference to their next-highest-in-command. The Main class has no way of reaching them, so they should be garbage collected. My reconsideration of DI The DI Container injects components with their required references and also maintains a reference to each of them. They each store a reference to their next-highest-in-command. The Main class can reach any of them via the DI Container, so they shouldn't be garbage collected.
I'm writing an application where I have many objects (data models) that are identified by a unique String ID that every such object possesses and these objects can refer to each other by their IDs.So far so good but now I need to keep track of which object keeps a reference to another object and of course there are cases where an object references (or is referenced by) more than one other object and I was wondering what would be the best method to store these references? In a simple map data structure I could just map one object's ID to another but as mentioned there are cases where an object can hold a ref to an arbitrary amount of other objects
I'm just getting to grips now with how the Garbage Collector works.
Is there a way (like a function or a custom class available somewhere) to check an object for all its references and return them so that you can see what it's connected to?
* Is it possible to create weak references to objects (like theventListener/EventDispatcher is able to do) so that if they are removed, you won't be stuck keeping a reference and taking up space to something that should be garbage collected?* Is there any way to find out how many active variables are referencing a certain object? This would be handy to actually create weak references, since, if you for example, have a static array containing all objects created in that class, you can do a regular check to see if there is only one remaining reference, and if so, you can safely remove it.
* Also, might there be any way to list the entire space (one big chunk of binary data, most likely) of every variable currently running in the program, all references, basically, what Flash is currently storing in RAM?I'm pretty sure that Flash (as crappy and lacking as it is in so many areas) does not have anything like any of these built in, but hopefully there is at least something.
I want to do is create several arrays to hold groups of movie clips (i am using as buttons) which have similar functions so that I can add event listeners using a for loop statement rather than making a huge list of add and remove event listeners.I have seen this method working before but I cannot get my code to work!! This is probably a very noob concept but I have been struggling with it for hours.Ok, so in the extends movie clip bit on my as file I declare the array as such:public static var controlBtns:Array;Then in the initializing function I put values into the array as such: [code]The trace seems to output all the object names (as they are listed in the library) and then I get this error: TypeError: Error #1010: A term is undefined and has no properties.Which is kind of obvious as I cannot seem to access the movie clip instance names that I have set up in the array.I tried putting quotation marks around the names in the array making them strings but then I can't access properties of strings - which is obvious enough to.
I have a bit of a memory leak issue in my Flex application, and the short version of my question is: is there any way (in AcitonScript 3) to find all live references to a given object? What I have is a number of views with presentation models behind each of them (using Swiz). The views of interest are children of a TabNavigator, so when I close the tab, the view is removed from the stage. When the view is removed from the stage, Swiz sets the model reference in the view to null, as it should. I also removeAllChildren() from the view.
However when profiling the application, when I do this and run a GC, neither the view nor the presentation model are freed (though both set their references to each other to null). One model object used by the view (not a presenter, though) IS freed, so it's not completely broken. I've only just started profiling today (firmly believing in not optimising too early), so I imagine there's some kind of reference floating around somewhere, but I can't see where, and what would be super helpful would be the ability to debug and see a list of objects that reference the target object. Is this at all possible, and if not natively, is there some light-weight way to code this into future apps for debugging purposes?
I have a 2-dimensional array of Objects. Their location in the array determines where they appear on the screen. When I want to move an object down, I am trying something like this: [AS]LocationArray[i][j+1] = LocationArray[i][j]; LocationArray[i][j] = null;[/AS]Of course, with the way AS3 handles objects and references, it removes the object completely. How can I simply move a reference (or remove an reference) without destroying the object?
loading external SWF's and its class files hanging around after the movie is unloaded....Its kind of tricky to explain, but you can see it very clearly in this file... http:[url]...Just run the main_stage.fla within flash [mx 04] and you'll see that if you click "Tester A" it will trace out "My Name is Tester A", then if you click on "Tester B" it will load a different swf, with a different class, but still trace out "My Name is Tester A" when it should be "My Name is Tester B"....
I have tried, unloading the swf's, removing the mc_Dropper and re-attaching it, re-declaring the variable testObj as null before declaring the class,
I am a new flash developer and I cannot seem to understand this problem. Whenever I try and trace one of these variables of type XMLList they all return NULL except for the last one in the array.The createDatsSets() function is designed to pull XMl data and copy it to an variable of type XMLList which resides in an array. This should happen 8 times to add data to all 8 variables.It works fine with a single variable but, in the for statement when.I try and trace any of the variables in the xmlList array only the last one has XML data in it.
I'm struggling a bit to fully understand garbage collection. To be honest I don't understand why this just can't be taken care of automatically but hey - I'm not a programmer so what do I know... Now to my question - I have the following code:
Code: var format:TextFormat = new TextFormat(); format.letterSpacing = -3.5; huvud_txt.setTextFormat(format);
Is it enough to set format = null; to destroy the format object or is there some crossreference going on here so that I need to do something more? huvud_txt is a textfield on stage - it's not created with code...
ActionScript Code: var clip:Sprite = new Sprite(); clip.name = "clip" addChild(clip); cleanup(clip) function cleanup(mc):void { mc.parent.removeChild(mc); mc = null trace(clip) // clip is removed from stage but traces as [object Sprite]. It still exists! }
How would I pass a MovieClip/Sprite/TextField through this function and remove it entirely?
I'm trying to trace the path of an object by using setPixel on the object's position every frame in a BitmapData/Bitmap pairing. These pixels aren't showing up normally and I suspect I have a fundamental misunderstanding of the BitmapData class. Here's what I'm doing:
public var contrailBase:BitmapData; public var contrail:Bitmap; private var contrailColor:uint;[code].....
Using this code, the red pixels don't show up. If I initialize contrailBase to 0xFF000000 instead then I get a black screen on which the red pixels DO draw, but I need the bitmap to be transparent except for the contrail. What am I doing wrong?
Do not worry about the syntax of this code. Here is my concern - The loader object which is used to send the HTTP request and which has the onLoadComplete event registered to is not referenced from outside the loadSomeContent() function. Is there a possibility that the loader object will be garbage collected and loadCompleteHandler() will never be called?
I've got to create a form with 2 fields (Name, email adress) that users can type their information into, but i then need to collect the data and store it somewhere (so i would then have a file showing everyone's names and email addresses that have been entered).I have quite a good knowledge of flash front end development but don't know alot about hooking stuff up to xml/php whatever
I want to do something where I collect functions to be invoked later when a certain condition is met. E.g.
function doSomething(someArg:Object):void { if (conditionIsFalse){ operationsToDoWhenConditionIsTrue.push(function(){ doSomething(someArg);
[Code]...
Basically if doSomething is called twice, I only want operationsToDoWhenConditionIsTrue to hold the most recent invocation. Obviously since the invocations are wrapped in function(){} all the functions are the same. Is there any way I can accomplish what I want?
how to display item name in object. I have got object and i would like to get its child but i don`t know name of that item. So i thought that i may trace that name but i don`t know how.