我在尝试使用JSManagedValue时遇到了问题.根据我在WWDC 2013上基于Session 615的理解,当你想要从Objective-C到Javascript的引用时,反之亦然,你需要使用JSManagedValue而不是仅仅在Objective-C中存储JSValue以避免引用周期.
这是我试图做的精简版.我有一个ViewController,它需要一个Javascript对象的引用,并且Javascript对象需要能够在ViewController上调用一个方法.ViewController有一个UILabel,它显示一个计数,并有两个UIButtons,'Add'递增计数,'Reset',用一个新的ViewController创建并替换当前的视图控制器(基本上我只能验证旧的ViewController)在我测试时正确清理干净).
在viewDidLoad,ViewController调用updateLabel并能够从Javascript对象中正确获取计数.但是,在运行循环结束后,Instruments正在显示JSValue正在发布.ViewController仍然存在,它的JSManagedValue也是如此,所以我认为应该防止JSValue被垃圾收集,但_managedValue.value现在返回nil.
如果我只是存储JSValue而不是使用JSManagedValue,那么它在视觉上都是可行的,但是ViewController和JSValue之间存在一个引用循环,正如预期的那样,并且Instruments确认ViewControllers永远不会被释放.
Javascript代码:
(function() {
var _count = 1;
var _view;
return {
add: function() {
_count++;
_view.updateLabel();
},
count: function() {
return _count;
},
setView: function(view) {
_view = view;
}
};
})()
Run Code Online (Sandbox Code Playgroud)
CAViewController.h
@protocol CAViewExports <JSExport>
- (void)updateLabel;
@end
@interface CAViewController : UIViewController<CAViewExports>
@property (nonatomic, weak) IBOutlet UILabel *countLabel;
@end
Run Code Online (Sandbox Code Playgroud)
CAViewController.m
@interface CAViewController () {
JSManagedValue *_managedValue;
}
@end
@implementation CAViewController
- (id)init { …Run Code Online (Sandbox Code Playgroud)