这是否Dictionary
可以清理所有关键参考?
public static function cleanDic(_dic:Dictionary):void
{
for (var eachKey:String in _dic)
{
delete _dic[eachKey];
}
}
我担心,如果我在for
循环期间删除某些键会导致无法清除所有元素。
这会发生吗?
谢谢
这是否Dictionary
可以清理所有关键参考?
public static function cleanDic(_dic:Dictionary):void
{
for (var eachKey:String in _dic)
{
delete _dic[eachKey];
}
}
我担心,如果我在for
循环期间删除某些键会导致无法清除所有元素。
这会发生吗?
谢谢
首先,我不喜欢这里给出的任何答案。现在,解释一下:
您的代码不会删除所有字典键,因为字典键可能是任何对象,而不是必需的字符串。所以,你需要迭代:
for (key:Object in dictionary) delete dictionary[key];
当您不想创建一个新字典时,有许多合理的场景——创建一个新字典有时是一个非常糟糕的替代品。例如,您在代码中的两个位置共享值(等等,为什么还要创建一个?)。一旦你创建了一个新的,代码中的位置应该被通知并以某种方式重新获得对新对象的新引用。因此,有时从字典中删除所有键虽然在计算上并不完全有效,但与创建一个新键相比会更好,因为它会使事情变得简单。
有一个有趣的方面Dictionary
。它实际上实现为两个哈希表,一个包含字符串键,另一个 - 指针键(对象键)。不幸的是,这是由于糟糕/粗心的设计,而不是故意的。它具有继承自的字符串哈希表Object
和自己的指针键之一。通常不希望将字符串放入字典(或任何其他隐式强制转换为字符串的内容,如数字或逻辑值),因此,当您发现自己使用带字典的字符串键时 - 再想一想,您可能想Object
改用.
在字典循环期间会发生什么:在幕后创建了一个键集合,实际上,您迭代了该集合。然而,由于字典的双重性质,两个键可能被认为是相同的(例如,如果您添加了一个字符串"1"
和 int1
键 - 您将只得到其中一个。删除键时,在不同的播放器版本有不同的结果。在一些旧版本中,有一个错误,在删除这些键然后序列化字典后,其中一个键保留在其中。但是,再次,您应该避免使用字符串或数字作为键。
无需编写清理Dictionary
. 只需使用:
yourdictionary = new Dictionary();
和 GarbageCollector 会做的伎俩。
我不太清楚你的意思
我担心,如果我在 for 循环中删除某些键会导致无法清除所有元素。
但是您的代码示例是正确的,这就是Dictionary
可以清理 a 的方式。(假设您只使用Dictionary
带有string
键的对象,因为您的for
循环使用string
. 请参阅下面的工程师评论。)
或者,您可以将您的字典设置为一个新实例 - 实现同样的速度稍快:
var dict:Dictionary = new Dictionary ();
... // use dict here
dict = new Dictionary (); // effectively cleans the dictionary
Flash 垃圾收集器应该释放字典中所有被丢弃的元素。__