My spam filter needs to be re-tuned to get rid of the {disarmed}. I'm going to
resend this so it gets on the thread vs. starting a new one. My apologies for
this.
-----
That helps a little; thanks.
Based on how you are describing the instances, my issue may be with the
debugger and variable scope within the debugger.
I'm talking about my instances instead of flex instances in my example. I'm
trying to figure out how code is initialized to understand where I should
separate code into its own class.
My first piece of code is a login routine that authenticates against a remote
object (coldfusion).
I've got the class structured like this:
Login.mxml
|
|---loginform.mxml
|
|---registrationform.mxml
|
|---forgotpassword.mxml
The login.mxml class states call each of the other form.mxml files under it.
Are these initialized when the state changes to include that class? Or are
they created when the application initialized? Then also, are the instances
destroyed or are they persistent (data still lives in them) when the login.mxml
class changes states say from registrationform to loginform?
Thanks much!
________________________________
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Gordon
Smith
Sent: Monday, July 28, 2008 3:34 PM
To: [email protected]
Subject: {Disarmed} RE: [flexcoders] mxml components
> all classes are created when the application is started
AS3 classes get initialized -- meaning that their static variables get set and
their static methods get executed -- in a lazy fashion, as they are used. If
you have bytecode for a class in your SWF and that class doesn't get used by
other code, that class will never get initialized.
On the other hand, *instances* of DisplayObject classes get created "top down"
when you use MXML. The Player automatically creates an instance of
SystemManager. The instance of SystemManager automatically creates an instance
of MainClass as its child. The instance of MainClass creates Class2 as its
child. Etc. MXML, with its tags nested inside other tags, is essentially
shorthand. For example,
<Button id="b" label="OK"/>
is basically shorthand for
public var b:Button;
...
// inside some method:
b = new Button();
b.label = "OK";
addChild(b);
It sounds like you might want to experiment with dynamically creating class
instances of DisplayObjects like this with 'new' -- and attaching them to
parents with addChild() and detatching them with removeChild() -- in order to
have more of a correspondence with what you're familiar with, namely C++. It
might be that the MXML syntax, which hides the instantiation details, is
confusing you.
> In C++ I would initialize the classes I wanted to use by using calling the
> class initializer().
I think you mean that you would create the instances you wanted by using the
'new' operator, which invokes the class's constructor.
> if I needed to access a private variable from MainClass.mxml I included the
> header file (in this case the class4.mxml file)
There are no header files in AS3. Instead of 'include'ing a header file, you
import a class. But if something is private you can't access it from any other
class.
> Also in C++ when I'm done with the instance I needed to call the destructor
> to shut the class down and free the memory
> I haven't seen a reference yet to destroy a class instances in Flex/AS3
A C++ destructor doesn't shut a class down; it gets called when an *instance*
is freed with the 'delete' operator. You don't have to delete instances in AS3
because they get "garbage collected". Periodically the runtime determines
whether there are any references to an instance. If not, it frees it. There is
no method similar to a destructor that gets called when this happens.
> I've gotten confused on how long those class instances live and when exactly
> they are initialized.
In the case you're describing, they live until you quit the app. If you did
something like use removeChild() to detach the instance of Class3 from the
instance of Class2, then the instances of Class3 and Class4 would become
subject to garbage collection. (Which doesn't necessarily ensure that they'll
actually get garbage collected unless the Player decides it is running low on
memory.) They were initialized by methods of framework core classes, such as
Container and SystemManager, in the top-down order that I previously described.
> When I use the debugger it doesn't look like in the above example that
> class4.mxml stays active if I leave the Class3.mxml code.
I'm not clear on what you're seeing, but it sounds like you're misinterpreting
it.
Gordon Smith
Adobe Flex SDK Team
________________________________
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Scott
Sent: Saturday, July 26, 2008 4:16 PM
To: [email protected]
Subject: RE: [flexcoders] mxml components
I was afraid of that...
Ok, let's see if I can do it better.
I understand that I'm not "calling" a class, but functions within the instance.
So if I understand the other message from Gordon correctly then all classes are
created when the application is started. However, it doesn't look like that in
the debugger when I'm running the application.
Let's take and expand my question example below...
MainClass.mxml
|
|-----Class2.mxml - ShowStat():Boolean
|
|-----Class3.mxml - LoggedIn():Boolean
| |--Class4.mxml - LogMeIn(strName:String,strPassword:String)
|-- private var bIsLoggedOn:Boolean
(This is fictitious for point of discussion)
If I control the display and how things are laid out in MainClass.mxml, I used
the Class2 and Class3.mxml files as subclasses to control the widgets on the
screen being placed by the MainClass.mxml.
In C++ I would initialize the classes I wanted to use by using calling the
class initializer(). (I have been using the creationComplete="init()" to start
code in the class instance.) Then if I needed to access a private variable from
MainClass.mxml I included the header file (in this case the class4.mxml file)
and called the function, in the above example LoggedIn():Boolean. Also in C++
when I'm done with the instance I needed to call the destructor to shut the
class down and free the memory. I haven't seen a reference yet to destroy a
class instances in Flex/AS3.
While using the individual "class".mxml files I've been created, I've gotten
confused on how long those class instances live and when exactly they are
initialized. And how do I "destroy" the class instances and the variables they
contain to free memory (is this necessary in Flex/AS3)? When I use the
debugger it doesn't look like in the above example that class4.mxml stays
active if I leave the Class3.mxml code.
Finally, if I had a reason to log the user in from another area in the code;
say from MainClass.mxml, if I wanted to call LogMeIn( myusername, mypassword)
from Class4.mxml I can't tell if I'm creating a new instance of that class or
am I using the existing instance? In other words...:
Are these the same instance or unique instances with in each of the class
instances themselves (mainclass/class3)?
MainClass.mxml:
<mx:script>
<![CDATA{
Import com.myapp.models.LoginClass;
...
..
And
Class3.mxml
<mx:script>
<![CDATA{
Import com.myapp.models.LoginClass;
...
..
________________________________
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Tracy
Spratt
Sent: Friday, July 25, 2008 5:07 PM
To: [email protected]
Subject: {Disarmed} RE: [flexcoders] mxml components
First, there are "classes" and "instances". When it matters, use these terms
correctly.
Second, "call" does not apply to a "class", or even really an "instance".
An instantiated class stays instantiated untill all references to it are
removed, and "Garbage Collection" has run and removed it.
If this is not the answer, perhaps you can rephrase your question, without
using the word "call"?
Tracy
________________________________
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Scott
Sent: Friday, July 25, 2008 5:59 PM
To: [email protected]
Subject: [flexcoders] mxml components
Ok, I'm trying to get a firm grasp on AS3 components/classes. I'm trying to
figure out how to structure code so I can optimize code re-use.
What is the life of a component/class in a flex application?
In other words...
If I have a main.mxml that calls another class like logins.mxml, is that class
in existence only while it's called? Once the event hits to call it back is
the class still alive? It looks like it kills it from memory but I'm not 100%
sure.
Take the following examples...
MainClass.mxml
|
|--------subclass1.mxml
|
|--------subclass2.mxml
| |----subclass2a.mxml
If MailClass.mxml calls subclass1.mxml, completes and then calls subclass2.mxml
which calls subclass2a.mxml, what are the lives of these classes?
Also, do I need to be worrying about cleanup or is that handled automatically?
I hope I'm explaining this well....
--
This message has been scanned for viruses and
dangerous content by MailScanner <http://www.mailscanner.info/> , and is
believed to be clean.
--
This message has been scanned for viruses and
dangerous content by MailScanner <http://www.mailscanner.info/> , and is
believed to be clean.
--
This message has been scanned for viruses and
dangerous content by MailScanner <http://www.mailscanner.info/> , and is
believed to be clean.