2014-04-19 1 views
0

이 프로젝트는 자바 스크립트와 네이티브 objc 메소드 사이의 통신에 관한 것입니다. 그리고 저는 Apple이 IOS7에서 JavascriptCore를 도입했다고 들었습니다. 여기 내 샘플 HTML은IOS7에 소개 된 Javascriptcore로 UIWebview의 ARC 문제

<html> 
<head> 
</head> 
<body> 
    <script> 
     function test2() 
     { 
      TASK.test2(); 
     } 
    </script> 
    <form> 

     <button type='button' onclick='TASK.test()'>Test</button> 

    </form> 

</body> 
</html> 

이며 내 원시 코드입니다. 나는 내가 JSExports 구현으로 내 클래스에 javascriptContext를 할당 webViewDidFinishLoad에이

@protocol TASKExports <JSExport> 
-(void)test; 
-(void)test2; 

포함되어 있습니다.

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; 

에게 명령입니다. 그러나 어느 부분이 잘못 되었습니까 ?? 많은 감사

답변

0

마침내 얻었습니다. 대신

ctx[@"TASK"] = self; 

의 난 당신이 self을 통과하면 당신은 유지주기에서 끝날 것 하나

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

:

ctx[@"TASK"] = [[Task alloc] init]; // that´s the way 

은 당신의 상황에 맞는 실행 클래스의 수도 사용하는 대표단을 상호 작용할 수 있습니다. –

0

하여이 하나 또는 JSContext에 자기가의 instance which is property을한다.

ctx[@"TASK"] = self.task; // don´t do, that leaks 
ctx[@"TASK"] = self; // that also leaks 

은 편안한 길을 갈 직접 자바 스크립트에서 당신은 "깨끗하고 비 유지"인스턴스를 통과해야 당신의 TASKExports 프로토콜에 선언 된 함수를 호출합니다. 유지주기를 피할 수있는 유일한 방법입니다. 내가 같은 일을하고 있어요

ctx[@"TASK"] = [[Task alloc] initWithDelegate:self]; // also works with blocks