删除 MovieClip 类会删除其中的 eventListeners 吗?

Posted

技术标签:

【中文标题】删除 MovieClip 类会删除其中的 eventListeners 吗?【英文标题】:Will removing a MovieClip class remove the eventListeners inside it? 【发布时间】:2014-07-28 20:56:32 【问题描述】:

所以,我有一个类(称为 A 类),它添加了一个 MovieClip 类的子类(既是库中的对象,也是 .as 文件)。 A 类会多次删除和添加这个类,所以我不想和一群什么都不做的 Listener 混在一起。

我想监听 MovieClip 上的点击,所以我想至少有几种树方法可以做到这一点:

    在添加/删除子级的同时添加和删除类 A 中的 EventListener。 在 MovieClip 类中添加 EventListener(用于监听自身的点击)作为文件。 在 MovieClip(在库中)中添加一个事件监听器。

所以,我的问题是:

    上述哪种方法最好,为什么? 您是否必须删除上述备选方案 1 中的 eventListener?这是一种很好的做法,对吧? 重要问题:如果我编写了上面备选方案 2 中的代码,是否每次添加 MovieClip 类时都创建一个新的 Eventlistener?和/或当类从 A 类中移除时,EventListener 是否会被移除?

如果有人能一次一个地清楚地回答这些问题,那就太好了,这样我就可以下定决心了。 =)

【问题讨论】:

【参考方案1】:
    由于您必须单击库 MovieClip 中的某些视觉对象,并且由于您的“MovieClip 类文件”控制库 MovieClip,因此您显然希望 .as 文件中的侦听器函数。

2 和 3。我认为您是在说您将从 A 类中多次添加和删除您的 MovieClip。除了您正在谈论的 CLICK 事件侦听器之外,您的 MovieClip 的 .as 文件应该有,另外两个事件监听器函数——一个在有 ADDED_TO_STAGE 事件时触发,另一个监听 REMOVED_FROM_STAGE 事件。每当您的 MovieClip 本身从显示列表中添加或删除时,这两个将添加和删除您的 CLICK 侦听器。

所以在 MovieClip 的构造函数中这样说:addEventListener(Event,ADDED_TO_STAGE,onAddedToStage,false,0,true);

在“onAddedToStage”函数中说: addEventListener(Event,REMOVED_FROM_STAGE,onRemovedFromStage; 然后添加您的 CLICK 侦听器。

在“onRemovedFromStage”函数中:删除 REMOVED_FROM_STAGE 侦听器和您的 CLICK 侦听器。

唯一没有被代码删除的监听器是 ADDED_TO_STAGE 监听器,但是因为你创建了一个对它的弱引用(注册它的 'addEventListener' 行中的 'true'),它最终会被垃圾回收,如果不再需要您的 MovieClip。

【讨论】:

抱歉回答晚了,但是……好吧,这很聪明!谢谢。以前从未使用过这种事件监听器。后续问题:如果我添加一个类(来自我的 Main 类),它会向舞台(第 1 帧)添加很多电影剪辑。然后我转到另一个框架,可能不会回到框架 1。删除第一个类有多重要?我是否还必须删除该类中的所有影片剪辑,或者当我删除我的类时它们是否会自动删除(通过 Main 类中的 removeChild)? 好的,首先(这不仅仅是一个技术问题)你不要“删除......类”。您从该类中删除已实例化的 MovieClip 对象。其次,您可以将其从显示列表中删除(使用 removeChild() ),但它仍将作为其类的实例存在于内存中,直到它被垃圾回收。或不!如果您真的希望它消失,则必须删除对它的所有引用(即设置它们 = null),并将其自身也无效化。 Flash 最终会对它进行垃圾收集,它会真正消失。 ...继续... MovieClip 的子级将在其父级时自动被垃圾收集。关于这一切还有更多需要了解。例如:gskinner.com/blog/archives/2006/07/as3_weakly_refe.html

以上是关于删除 MovieClip 类会删除其中的 eventListeners 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过选择一行并按下删除按钮来删除 MovieClip?

删除movieclip子项的动作脚本

你如何删除一个点?

Codeforces 1291A - Even But Not Even

在symfony项目中使用ajax来删除项目

无法扩展:TailwindCSS 变体: