如何摆脱空的 StyleProtoChain 对象引用?

Posted

技术标签:

【中文标题】如何摆脱空的 StyleProtoChain 对象引用?【英文标题】:How do I get rid of a null StyleProtoChain object reference? 【发布时间】:2010-10-30 00:28:18 【问题描述】:

这是错误:

TypeError:错误 #1009:无法访问空对象引用的属性或方法。 在 mx.styles::StyleProtoChain$/initProtoChainForUIComponentStyleName()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\styles\StyleProtoChain.as:72] 在 mx.core::UIComponent/http://www.adobe.com/2006/flex/mx/internal::initProtoChain()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:7469] 在 mx.core::UIComponent/regenerateStyleCache()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:7690] 在 mx.core::UIComponent/http://www.adobe.com/2006/flex/mx/internal::addingChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:5239] 在 mx.core::UIComponent/addChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:4955] 在 mx.controls.listClasses::ListBase/createChildren()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:3103] 在 mx.core::UIComponent/initialize()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:5370] 在 mx.core::UIComponent/http://www.adobe.com/2006/flex/mx/internal::childAdded()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:5267] 在 mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::childAdded()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:3305] 在 mx.core::Container/addChildAt()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2217] 在 mx.core::Container/addChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2140] 在模型::MessageBoard()[C:\Documents and Settings\dbabbitt\My Documents\Flex Builder 3\ListExample\src\model\MessageBoard.as:56] 在模型::MessageBoard$cinit() 在 global$init()[C:\Documents and Settings\dbabbitt\My Documents\Flex Builder 3\ListExample\src\model\MessageBoard.as:7] 在 main()[C:\Documents and Settings\dbabbitt\My Documents\Flex Builder 3\ListExample\src\main.mxml:56] 在 _main_mx_managers_SystemManager/create() 在 mx.managers::SystemManager/initializeTopLevelWindow()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3188] 在 mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3064] 在 mx.managers::SystemManager/docFrameListener()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:2916]

这里是 main.mxml:

<?xml version="1.0"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > <mx:Script> <![CDATA[ import model.MessageBoard; public var _messageBoard:MessageBoard = MessageBoard.instance; ]]> </mx:Script> </mx:Application> 这是 MessageBoard.as:
package model 
    import mx.containers.VBox;
    import mx.controls.Label;

    [Bindable]
    public class MessageBoard extends VBox 

        /** The message list title. */
        private var _messageTitle:Label;

        /** The maximum message count. */
        private var _maxMessageCount:int = 4;

        /** Storage for the singleton instance. */
        private static const _instance:MessageBoard = new MessageBoard( SingletonLock );

        /** Provides singleton access to the instance. */
        public static function get instance():MessageBoard 
            return _instance;
        

        /**
         * Constructor
         * 
         * @param lock The Singleton lock class to pevent outside instantiation.
         */
        public function MessageBoard( lock:Class ) 
            super();

            // Verify that the lock is the correct class reference.
            if ( lock != SingletonLock ) 
                throw new Error( "Invalid Singleton access.  Use MessageBoard.instance." );
            

            _messageTitle = new Label();
            _messageTitle.text = "Message Board";
            this.addChild(_messageTitle);
        

     // end class
 // end package

class SingletonLock 
 // end class

也许你可以教我如何将空对象引用排除在复杂的类之外?

感谢

戴夫

【问题讨论】:

【参考方案1】:

看起来错误可能来自对 MessageBoard 类的构造函数中的 addChild() 方法的调用。您很可能在 UIComponent 生命周期中过早地调用此方法。我建议重写 createChildren() 方法并在那里添加您的子元素。

override protected function createChildren():void

    super.createChildren();
    _messageTitle = new Label();
    _messageTitle.text = "Message Board";
    this.addChildAt(_messageTitle, 0);

【讨论】:

你能证明你在说什么吗? 我想我现在明白如何创建复合对象了,感谢您的轻推:“this.addChild”部分必须被推入 createChildren 方法。如果您有其他 .addChild 部分,则它们必须进入自己的类,在该类中重复该过程。 大部分是正确的。有时,由于在自定义组件上设置了属性,您需要创建子级。在这种情况下,为属性编写一个 setter 并在其中调用 invalidateProperties();这将导致稍后调用 commitProperties()。然后,您可以覆盖 commitProperties() 并根据需要动态创建或销毁子项。这与许多内置 Flex 组件使用的机制相同,了解它的工作原理非常有用。 :)

以上是关于如何摆脱空的 StyleProtoChain 对象引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱 TableBody 中的表格单元格?

如何摆脱div之间的空间[重复]

Xamarin UWP - 如何摆脱悬停在按钮上时出现的边框

如何销毁 QPainter 对象/摆脱 drawText() 内存泄漏?

为什么此JSON对象返回反斜杠?我该如何摆脱它们?

在 Oracle 中注册 XML 模式 - 如何摆脱剩余对象