Flex 中可能导致内存泄露的地方
收集了不少的会导致内存泄露的情况:
事件监听:
对父级对象加了监听函数,会造成内存泄露,例:
override protected function mouseDownHandler(…):void
{
systemManager.addEventListener(“mouseUp”, mouseUpHandler);
......
解决:
在销毁对象的时候,remove掉这些监听,虽然弱引用也可以避免这些问题,但自己掌控感觉更好。
但以下几种情况不会造成内存泄露:
弱引用:someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, true);
对自己的引用:this.addEventListener(MouseClick.CLICK, handlerFunction);
子对象的引用:
private var childObject:UIComponent = new UIComponent;
addChild(childObject);
childObject.addEventListener(MouseEvent.CLICK, clickHandler);
总之…有addEventListener,就removeEventListener一下吧,要为自己做的事负责~哈哈
清除引用
remove掉子对象后并不会删除该对象,他还保留在内存中,应该将引用设置为null
removeChildren(obj);
obj = null;
静态成员
Class (或MXML)中有:
public static var _eventService : M ......
FLEX中所有的布局都需要容器。<mx:Application>标签实际上就是一个容器。每个容器都有一定的规则来确定子元素的排列方式,也就是本文讨论的FLEX容器布局规则。
VBox
子元素沿垂直方向排列。每个子元素都会绘制在前一个子元素的下方。
HBox
子元素沿水平方向排列。每个子元素都会绘制在前一个子元素的右方。
Canvas
按开发者指定的x坐标与y坐标绘制子元素。如果没有指定坐标,则所有的子元素都绘制在容器的左上方。例如,如果在Canvas中添加一个Button控件而不为其指定坐标,那么Button就被呈现在Canvas的左上角,默认的(0,0)位置。
Application
通过使用layout属性,Application布局能设置成类似VBox、HBox或Canvas容器中的任何一种方式。
Tile
将其子元素排列成一个或者多个横行或者竖列,在需要时增加新行或者新列。所有的Tile容器单元格大小都相同。Flex将Tile容器的单元格排列在正方形网格中,每一个单元格内放入一个子元素。布局方式由direction属性决定。
Pnael
Box容器的子类。Panel容器可以像VBox、HBox或者Canvas容器之中的任何一种那样布局,这取决于指定的layout属性(默认为absolute,与Canvas一样)。除了可以包含子元素,Panel容器还提供了标 ......
1.如果使用MVC框架,相信这并不是一个问题。而如果没有使用的话,可以用类似的方法设置一个单例,子窗口和父窗口通过这个单例来交互消息,如果需要解耦,请发送自定义事件。总之,只要按照MVC思路来做就可以了。
2.类似JS,在子窗口的构造函数里增加一个参数,将父窗口传参进去。MXML没有构造函数,用一个属性来保存父窗口引用也可以。
3.无论是createPopUp还是addPopUp,他们都有一个返回值,得到子窗口的实例。可以对这个实例监听remove事件,并在这个事件中直接读取子窗口需要返回给父窗口的属性。(记得要将这个事件最终移除)
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Panel x="94" y="178" width="503" height="347" layout="absolute">
<mx:TextInput x="134" y="64" id="tit_usr" text="username"/>
<mx:TextInput x="134" y="125" id="tit_psw" text="password"/>
<mx:Button x="171" y="209" ......
一、自定义Panel组件
package test
{
import mx.containers.Panel;
import mx.core.UIComponent;
/**
* 自定义Panel
* **/
public class MyPanel extends Panel
{
import mx.controls.LinkButton;
import flash.events.MouseEvent;
import flash.events.Event;
private var _cusContr:UIComponent;//客户UI组件
public function get cusContr():UIComponent{
return _cusContr;
  ......
选定矩形的一个顶点为起点,开始画
x0:顶点横坐标
y0:顶点纵坐标
x1:水平线上另一顶点的横坐标
y1:水平线上另一丁点的纵坐标
private function drawDottenRect(g:Graphics,
x0:Number,
y0:Number,
x1:Number,
y1:Number):void{
drawDottedHorizontalLineTo(g,y0,x0,x1);
drawDottedVerticalLineTo(g,x0,y0,y1);
&nbs ......
测试文件代码如下:导入com.hillelcoren.components包
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:hc="com.hillelcoren.components.*"
xmlns:classes="com.hillelcoren.components.autoComplete.classes.*"
xmlns:local="*"
width="100%" height="100%" color="#000000"
verticalAlign="top" horizontalAlign="left"
paddingLeft="20" paddingTop="15" paddingBottom="20" paddingRight="20"
initialize="init()">
<mx:Script>
<![CDATA[
import mx.utils.ObjectUtil;
import mx.events.MenuEvent;
import com.hillelcoren.components.AutoComplete;
import mx.core.Application;
import mx.core.UIComponent;
import mx.collections.ArrayCollection;
[Bindable]
public var colors:ArrayCollection;
......