一个flash bug的fix过程

早上在调试一段代码.正在按部就班的码代码。突然 一个对象报空对象引用了...
于是我郁闷了.这个bug让我很意外。
代码如下.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="initApp()">
<mx:Script>
<![CDATA[
private function initApp()
{
vCameraShow.height;

}
]]>
</mx:Script>
<mx:ViewStack id="vStack" borderStyle="solid" color="0x323232" >
<mx:Canvas id="vPictureCanvas" borderColor="0x000000" borderStyle="solid" borderThickness="0" >
<mx:Image id="vPicture" x="0" y="0" width="320" height="240"/>
</mx:Canvas>
<mx:Canvas id="vCameraCanvas" backgroundColor="#FFFFCC" label="Search" width="100%" height="100%">
<mx:VideoDisplay id="vCameraShow" width="320" height="240" />
</mx:Canvas>
</mx:ViewStack>
</mx:Application>

苦思许久,注意到出现bug的位置是viewStack里的第二个控件...
我就在想.会不会viewStack只默认实例化第一个控件?
于是我就调换了vPictureCanvas和vCameraCanvas的位置。然后调试。果然.vCameraShow.Height操作没有报空对象异常

为什么会这样?上网查了一下.viewstack使用了一种叫做 deferred instantiation的技术。需要的时候才实例化 这样可以提高性能.

而在Container对象中 有一个属性能改变这种实例化策略。此属性值叫做createPolicy
可以设置为4个值.
auto 默认.defered instantiation
all:在单一视图容器里实例化全部组件
none:指示Flex不实例化任何组件,除非你手动实例化组件。

当creationPolicy属性的值为none时,应该明确地指定容器的长和宽。正常情况吓,Flex会自动对容器进行比例缩放以使它能够容纳子实例,但因为creationPolicy属性的值设为none,开始时没有实例化容器内的子实例,要进行比例缩放是不可能的。如果你没有明确地调整容器的大小,直到容器内的子实例被实例化后才会自动调整大小以容纳子实例。

要手动实例化组件,请使用createComponentsFromDescriptors()方法。更多信息请看:Creating deferred components

queued:对延迟实例化组件没有影响。

所以 这里.把createPolicy设置为all能解决问题.

代码里加上creationPolicy="all".执行.果然成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值