JSManagedValue对底层Javascript值的引用
使用JSManagedValue
保存值时,需要注意其底层的Javascript
值的使用。
JSManagedValue
添加了”条件保留(conditional retain
)”机制为值提供自动内存管理,不过需要使用JSVirtualMachine
的addManagedReference(_:withOwner:)
方法。如果没有的话可能会导致一些问题,因为JSManagedValue
行为类似于ARC
的weak
引用,所以当Javascript
的垃圾收集器把JSManagedValue
的底层Javascript
值销毁时,JSManagedValue
对象的value
属性会自动变成nil
。
下面是我写的一个Bug:
// action为局部变量
const action = function () {
window.location.href = 'https://www.baidu.com';
setTimeout(() => {
api.setMenu([]);
}, 300);
};
appApi.setMenu([{
menuTitle: '订单',
menuAction: action,
}]);
menuAction
是一个Javascript
回调函数,在iOS
代码中用一个JSManagedValue
来包装menuAction
值,但由于menuAction
是一个局部变量,所以一定时间会被回收;这时如果想再从JSManagedValue
中取出menuAction
回调来执行,由于其值已变成nil
,所以不会产生任何效果。
还是得多读读文档啊。
参考