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