Objective-CはJavaScriptとインタラクティブなあれらのこと(続)

7115 ワード

注:この文章は今はiOS 7に似合う学生だけが読むことを勧めています.iOS 7を捨てたらWKWebViewを使うことを強く勧めます.WKWebViewの記事が出ました.WKWebViewの使用と注意点(keng)
インタラクティブの詳細は私の書いた前の文章JavaScriptとObjective-Cを参考にしてインタラクティブなあれらのことができます.もう書きましたが、なぜ何ヶ月ぶりに続編が作られますか?これは過去数ヶ月の使用過程でいくつかの深い穴ができたからです.ここで特に強調します.深穴は主にメモリ管理といつ相互作用の対象を注入するのが合理的ですか?
メモリ管理
メモリ漏れ問題
私の最初の文章の中に注入されたインタラクティブオブジェクトは selfで、このようにJSContext を参照して selfを脱退したとき、 selfJSContextによって参照されて解放されないので、JSContextはコントローラが解放されるのを待つしかないので、循環参照を引き起こし、メモリ漏れを引き起こす.
解決策
この問題について3つの解決策を言います.
  • は、私が参照した文章で述べたように、直接 selfを使用するのではなく、中間のオブジェクトを注入して対話することができる.iOSとJSの相互作用実戦編(ObjC版)は、オブジェクト内でエージェントを追加するか、またはBlockを追加してコントローラとの通信を行う必要があるかもしれない.
  • 注入対象を注入クラス[self class]に変更すると、メモリリークを防ぐことができますが、書いたプロキシ方法はクラス方法に変更されます.すべての使用方法は実際の開発に不便をもたらします.
  • は、Blockを用いて交互にJSExport を除去する.
  • インタラクティブオブジェクトをタイミングよく注入する
    UICWebViewはいつJSContext環境を創建しますか?UIWebViewはいつJSContext を作成しますか?二つの方法に分けて、最初のページをレンダリングする時 , <code>JSContext </code> <code>JavaScript </code>。 <code>[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]</code> <code>JSContext </code> , <code><script </code>, <code>JSContext </code>, <code><script </code> 。</p> <h4> </h4> <p> , <code>- (void)webViewDidFinishLoad:(UIWebView *)webView</code> , ,<code>JavaScript</code> , 。 <code>- (void)viewDidLoad</code> , , , , <code>JSContext </code> , <code>- (void)viewDidLoad</code> , , , 。 <code>- (void)viewDidLoad</code> <code>- (void)webViewDidFinishLoad:(UIWebView *)webView</code> , 。</p> <h4> </h4> <p> ? , <code>JSContext </code> , 。 UIWebView-TS_JavaScriptContext。 , <code>- (void)webView:(id)unused didCreateJavaScriptContext:(JSContext*)ctx forFrame:(id<TSWebFrame>)frame</code> <code>parentFrame</code> <code>API</code> , <code>Issues</code> 。 <code>readme</code> , , 。 , 。</p> <h4>UIWebView-TS_JavaScriptContext readme </h4> <p> iOS , 。 web/native ( <code>UIWebView</code> JavaScript App ObjectiveC ) 。</p> <p> ObjectiveC , <code>stringByEvaluatingJavaScriptFromString</code> 。 JavaScript <code>window.location</code> <code>UIWebView</code> <code>shouldStartLoadWithRequest:</code>。 <code>NSURLProtocol</code> <code>XMLHttpRequest</code> 。</p> <p> iOS7 JavaScriptCore(WebKit ), ObjectiveC JavaScript 。 ,<code>UIWebView</code> WebKit JavaScriptCore, 。</p> <p> KVC <code>UIWebView</code> <code>JSContext</code>。 。 , <code>UIWebView</code> 。</p> <p> <code>UIWebView</code> <code>JSContext</code>。 , 。 AppStore。 , <code>UIWebView</code> <code>UIWebView</code> WebKit JavaScriptCore。( , )</p> <p> :WebKit <code>WebFrameLoadDelegate</code> UIWebView UIWebViewDelegate。<code>WebFrameLoadDelegate</code> <code>webView:didCreateJavaScriptContext:forFrame:</code> ,WebKit , 。 WebKit (<code>WebFrameLoaderClient.mm</code>)</p> <pre><code>if (implementations->didCreateJavaScriptContextForFrameFunc) { CallFrameLoadDelegate(implementations->didCreateJavaScriptContextForFrameFunc, webView, @selector(webView:didCreateJavaScriptContext:forFrame:), script.javaScriptContext(), m_webFrame.get()); } </code></pre> <p> iOS,<code>UIWebView</code> , WebKit <code>WebFrameLoadDelegate</code> , <code>webView:didCreateJavaScriptContext:forFrame:</code> WebKit 。 , 。</p> <p> , OC 。 。 <code>NSObject</code> <code>webView:didCreateJavaScriptContext:forFrame:</code> 。</p> <p> , WebKit , ( UIWebView sink object) <code>NSObject</code>, <code>webView:didCreateJavaScriptContext:forFrame:</code> 。 <code>UIWebView</code> sink object , 。</p> <p> WebKit WebKit WebView( <code>UIWebView</code>), JavaScriptCore <code>JSContext</code> WebKit WebFrame。 WebKit , WebView WebFrame 。 JSContext , JavaScriptCore 。( , WebFrame , )</p> <p> JSContext UIWebView。 WebView view UIWebView. UIView , UIView。 , 。</p> <p> app UIWebViews( , ) <code>stringByEvaluatingJavaScriptFromString:</code> token"cookie" JavaScriptContext , JSContext token, UIWebView 。</p> <p> JSContext 。 App ObjectiveC blocks JavaScript 。</p> <h2> </h2> <p> , , , 。 , 。 readme , , 。</p> <h2> </h2> <ul> <li>(2016.11.19) WKWebView, , WKWebView (keng) </li> </ul> <h2> </h2> <ul> <li>JavaScriptCore </li> <li>UIWebView-TS_JavaScriptContext</li> </ul> </article> </div> </div> </div> <!--PC WAP --> <div id="SOHUCS" sid="1199774195295297536"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"> に出会います.