-
Notifications
You must be signed in to change notification settings - Fork 700
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Unity] 继承C#类的JS类,其对象的引用问题 #65
Comments
补充: 造了个神奇的玩意儿,然而发现Unity里ConditionalWeakTable支持的不好 static ConditionalWeakTable<object, Action> refTable = new ConditionalWeakTable<object, Action>();
public static void RefJSObject(this object o, Action callback)
{
refTable.Add(o, callback);
} class MyNodeData extends System.Object {
constructor() {
super();
this.RefJSObject(() => this);
}
} |
搞得太复杂了, 你用临时变量才会被释放, 把你的userData也放到对象属性里面不就完事了. |
@Joycraft |
需求: 用JS扩展C#类, JS部分要随C#对象一起销毁 ConditionalWeakTable的想法是给任意C#对象引用一个JS对象(通过JS函数捕获JS对象,然后通过Action让C#这边持有它的引用)
|
我的个人看法, 按照标准的JS行为, 这些临时变量就应该直接释放的, 如果你不想被释放, 就需显式的用对象的字段来储存. 如果实现了你说的这个特性, 本来按照标准js行为应该释放的反而没有被释放了,变成了隐式的自动储存, 而开发者反而需要去维护循环引用的问题, 一旦开始循环引用, 那么正确的释放反而成了难题, 本来之前js开发者根据标准行为养成的编程习惯, 估计会对这种非标准行为很困惑. 如果这类的需求很多, 其实可以作为一个特定的框架来实现, 而不应该由通用的内核和底层来自带, 作为框架的标准行为是没有问题的. |
@Joycraft 可能例子没说清楚,rootNode是树控件的一个成员,不是临时的,而rootNode引用了node,node引用了userData; node.userData = userData; 关键是这一句,目前的实现是“只会提取userData的C#部分进行赋值,JS部分不产生引用”,这个不符合JS用户的使用习惯,容易造踩坑 |
MyNodeData虽然是继承自System.Object, 但它实际创建的应该是js对象而非C#对象. |
举个例子说明一下
非常容易踩坑,是否应该在构造JS对象的时候维护一个 C#对象对JS对象的引用关系?
The text was updated successfully, but these errors were encountered: