meta data for this page
  •  

📚 差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

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