meta data for this page
📚 差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录前一修订版 | |||
| developer:extend:issue_script [2024/08/10 04:09] – ↷ 页面scripting:extend:issue被移动并更名为developer:extend:issue_script bibiboxs | developer:extend:issue_script [2025/07/24 17:33] (当前版本) – 移除 bibiboxs | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | < | ||
| - | # 脚本问题及规范事项 | ||
| - | 本文将记录**目前已知或可能出现的脚本问题,以及脚本开发阶段的相关规范事项**。 | ||
| - | |||
| - | 如果开发过程中出现了问题,可以参考本文所说明的内容,或者反馈给开发组跟进。 | ||
| - | |||
| - | |||
| - | |||
| - | ## 对象销毁后,引用仍然存在 | ||
| - | |||
| - | > 在一些情况下,我们可能习惯性将某些对象引用到变量中**(主要针对`Entity`类)**。 | ||
| - | > | ||
| - | > 这样虽然可能为开发阶段带来方便,但是也可能会引起一些小的隐患。 | ||
| - | |||
| - | ```javascript | ||
| - | let chara = Character.Create(...); | ||
| - | if(chara) chara.Remove(); | ||
| - | |||
| - | DLog(chara); | ||
| - | ``` | ||
| - | |||
| - | 根据上方的代码示例,一个有点奇怪的问题就出现了,明明角色对象已经被`Remove()`销毁,为什么仍然可以输出`chara`变量?并且其中的值基本都是正常的。 | ||
| - | |||
| - | > **这是由于GC(垃圾处理)机制并非实时的,虽然此时已经`Remove`了对象,但是`let chara`对其的引用是仍然存在的。** | ||
| - | > | ||
| - | > *这时虽然可以正常访问`chara`变量,但实际上如果继续操作对象将会产生提示报错。** | ||
| - | |||
| - | 如果希望避免这类问题,应该在**判断非`null`的基础上,额外进行合法化(`IsValid()`)的判定**。 | ||
| - | |||
| - | ```javascript | ||
| - | let chara = Character.Create(...); | ||
| - | if(chara) chara.Remove(); | ||
| - | |||
| - | DLog(chara); | ||
| - | if(chara != null) DLog(chara.IsValid()); | ||
| - | ``` | ||
| - | |||
| - | 聪明的你应该已经看出来,**关键在于`entity.IsValid()`方法**,这可以用来判断一个**对象是否是真实存在**的,返回`false`则表示对象已经销毁,只是GC没来得及清理。 | ||
| - | |||
| - | **总结:对于`Entity`类型的【引用】对象,判断是否存在时不仅要判断`null`,同时也要判断不为空时`entity.IsValid()`是否存在。** | ||
| - | |||
| - | |||
| - | </ | ||