这个项目是关于在javascript和native objc方法之间进行通信。我听说Apple在IOS7中引入了JavascriptCore。所以,这是我的示例html
<html>
<head>
</head>
<body>
<script>
function test2()
{
TASK.test2();
}
</script>
<form>
<button type='button' onclick='TASK.test()'>Test</button>
</form>
</body>
</html>
并在我的原生代码中。我包括了这个
@protocol TASKExports <JSExport>
-(void)test;
-(void)test2;
webViewDidFinishLoad上的我在实现JSExports时将javascriptContext分配给了我的类。
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"TASK"] = self;
运行程序,一切顺利,但是当我弹出这个viewcontroller时。发现它不是dealloc而是保留了它。我尝试了几种方法来解决它。
方法1,删除html中的scrtpt标签。删除此
<script>
function test2()
{
TASK.test2();
}
</script>
其次,是命令这一行
ctx[@"TASK"] = self;
我很确定它是由javascript上下文保留的。但哪一部分是错的? 非常感谢
答案 0 :(得分:0)
最后我明白了。 而不是这个
ctx[@"TASK"] = self;
我逐一做到这一点
ctx[@"TAST_test1"] = ^{
Code goes here
};
ctx[@"TAST_test2"] = ^{
Code goes here
};
答案 1 :(得分:0)
如果您将自己的self
或instance which is property
传递给JSContext,则最终会处于保留周期。
ctx[@"TASK"] = self.task; // don´t do, that leaks
ctx[@"TASK"] = self; // that also leaks
要以舒适的方式直接从JavaScript调用TASKExports
协议中声明的函数,您必须传递“干净且不保留”的实例。这是避免保留周期的唯一方法。
ctx[@"TASK"] = [[Task alloc] init]; // that´s the way
要与您的上下文运行类进行交互,也可以使用委托:
ctx[@"TASK"] = [[Task alloc] initWithDelegate:self]; // also works with blocks