一、問題描述
html代碼如下
1 <html> 2 <head> 3 <meta charset="utf-8"/> 4 <title>我的網頁</title> 5 <script type="text/javascript"> 6 function JS2OC() 7 { 8 window.location.href="fzw://send"; 9 } 10 </script> 11 </head> 12 <body> 13 <input value="js調用oc" type="button" onclick='JS2OC();'></input> 14 </body> 15 </html>
顯示效果如下
oc代碼如下
1 /** 2 * 跳轉判斷 3 */ 4 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 5 { 6 NSString *urlString = request.URL.absoluteString; 7 NSLog(@"urlString:%@",urlString); 8 NSString *preString = @"fzw://"; 9 if([urlString hasPrefix:preString]) 10 { 11 NSString *methodString = [urlString substringFromIndex:preString.length]; 12 NSLog(@"methodString:%@",methodString); 13 [self performSelector:NSSelectorFromString(methodString)]; 14 return NO; 15 } 16 return YES; 17 } 18 19 -(void)send 20 { 21 NSLog(@"%s",__func__); 22 }
點擊demo.html的按鈕“js調用oc”,網頁跳轉到fzw://send。UIWebView的代理方法- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType攔截頁面並獲取網頁鏈接fzw://send,經過處理,最后調用oc指定方法-(void)send,並返回NO取消跳轉,從而達到js調用oc方法。
但xcode提示警告: PerformSelector may cause a leak because its selector is unknown
二、問題分析
編譯器的警告對開發者來說是很有用的信息,但有時由於編譯器的智商實在太低,會提示一些無謂的警告。當有些警告不想看到時,可以用如下代碼消除警告。
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-W警告名稱"
需要關閉警告的代碼
#pragma clang diagnostic pop
三、問題解決
該警告的名稱為-Warc-performSelector-leaks
1 /** 2 * 跳轉判斷 3 */ 4 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 5 { 6 NSString *urlString = request.URL.absoluteString; 7 NSLog(@"urlString:%@",urlString); 8 NSString *preString = @"fzw://"; 9 if([urlString hasPrefix:preString]) 10 { 11 NSString *methodString = [urlString substringFromIndex:preString.length]; 12 NSLog(@"methodString:%@",methodString); 13 #pragma clang diagnostic push 14 #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 15 [self performSelector:NSSelectorFromString(methodString)]; 16 #pragma clang diagnostic pop 17 return NO; 18 } 19 return YES; 20 } 21 22 -(void)send 23 { 24 NSLog(@"%s",__func__); 25 }