使用JSManagedValue保存值时,需要注意其底层的Javascript值的使用。

JSManagedValue添加了”条件保留(conditional retain)”机制为值提供自动内存管理,不过需要使用JSVirtualMachineaddManagedReference(_:withOwner:)方法。如果没有的话可能会导致一些问题,因为JSManagedValue行为类似于ARCweak引用,所以当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,所以不会产生任何效果。

还是得多读读文档啊。

参考

  1. JSManagedValue Reference