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,所以不会产生任何效果。
还是得多读读文档啊。
参考