小编Jak*_*rer的帖子

如何在没有JSValue发布的情况下使用JSManagedValue来避免引用循环?

我在尝试使用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)

javascript objective-c javascriptcore

5
推荐指数
1
解决办法
1362
查看次数

标签 统计

javascript ×1

javascriptcore ×1

objective-c ×1