在IOS7中引入了带有Javascriptcore的UIWebview的ARC问题

时间:2014-04-19 18:54:46

标签: javascript ios7 uiwebview

这个项目是关于在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上下文保留的。但哪一部分是错的? 非常感谢

2 个答案:

答案 0 :(得分:0)

最后我明白了。 而不是这个

ctx[@"TASK"] = self;

我逐一做到这一点

ctx[@"TAST_test1"] = ^{
    Code goes here
};
ctx[@"TAST_test2"] = ^{
    Code goes here
};

答案 1 :(得分:0)

如果您将自己的selfinstance 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