AS3:GC通过引用计数 - 我应该设置textField.defaultTextFormat = null吗?

时间:2014-11-27 19:04:52

标签: actionscript-3 reference garbage-collection

我正在尝试非常小心地在完成对象时从对象中删除引用,这样它们就有资格获得垃圾收集的更快的引用计数方法。我有一个类创建一个TextField并将TextFormat应用于它。 TextFormat使用一个局部变量,所以我知道我不必担心将它归零,因为它会超出范围,但是当我完成时我应该将TextField的defaultTextFormat属性设置为null吗?超出范围后,TextFormat仍然应用于TextField,所以我认为它仍然可以被认为是引用,即使它没有变量名。

此外,是否有一种简单的方法可以查看对象有多少引用,以便查看它是否为0?

2 个答案:

答案 0 :(得分:1)

我很确定TextFormats在分配时会被复制,这意味着它们不是对原始对象的引用。

这意味着对于垃圾收集不会产生任何影响,无论您将其设置为null(以后null都不是defaultTextFormat的有效值),因为TextField不包含对传递的TextFormat对象的引用。

示例:

var txt:TextField = new TextField();

var tf:TextFormat = new TextFormat();

txt.defaultTextFormat = tf;

tf.color = 0xFF0000;
txt.text = txt.text; //color will stay the same (not red) since it doesn't actually reference the original object

txt.defaultTextFormat = tf; //now it will change color since we reapplied it (it made a new copy of the text format object).
txt.text = txt.text;

答案 1 :(得分:0)

如果您这样做:text_field.defaultTextFormat = null,则会出现TypeError错误。另外,我认为Flash总是将默认TextFormat分配给文本字段,因此最好的方法是在将文本格式设置为null后使用它,如下所示:

var text_field:TextField = new TextField()
    text_field.text = 'hello world !'
    addChild(text_field)

var default_fmt:TextFormat = text_field.getTextFormat()
var new_fmt:TextFormat = new TextFormat()
    new_fmt.color = 0xff9900

// we start by assigning the new text format to our text field to get an orange text
text_field.defaultTextFormat = new_fmt
text_field.text = text_field.text   

// then we can free our new text format and assign the default text format to our text field
new_fmt = null
text_field.defaultTextFormat = default_fmt
text_field.text = text_field.text   

对于你的第二部分问题,关于对象引用,我认为你是在谈论对象实例,如果是,你可以试试这个函数:

function get_instances_count(container:DisplayObjectContainer, type:Class):int {
    var count:int = 0
    for(var i:int = 0; i < container.numChildren; i++){
        var obj = container.getChildAt(i)
        if(obj is type){
            count++
        }
    }
    return count;
}
// to use it
trace(get_instances_count(stage, red_button))