我的Swift应用程序 UIWebView 在尝试获取当前网址时与 exc_bad_access 崩溃。它仅在某些情况下崩溃(通常取决于用户在 UIWebView 中执行的操作)。尝试加载代码中提供的网址,然后点击取消。如果我没有实现UIWebViewDelegate
协议中的方法,它永远不会崩溃。
class AuthViewController: UIViewController, UIWebViewDelegate {
@IBOutlet var authWebView: UIWebView
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialisation
}
override func viewDidLoad() {
super.viewDidLoad()
self.authWebView.delegate = self
var url = NSURL(string:"http://oauth.vk.com/authorize?client_id=4423823&scope=audio&display=mobile&v=5.21")
var urlRequest = NSMutableURLRequest(URL: url)
self.authWebView.loadRequest(urlRequest)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func webViewDidFinishLoad(webView:UIWebView) {
NSLog( webView.request!.URL!.absoluteString )
}
}
我还试图在获取URL之前尝试实现此方法以检查请求对象是否存在,但它没有帮助。
func webView(webView: UIWebView!,
shouldStartLoadWithRequest request: NSURLRequest!,
navigationType navigationType: UIWebViewNavigationType) -> Bool {
if !self.authWebView.request {
return false
} else {
return true
}
}
答案 0 :(得分:4)
我发现了错误:
某些网址包含特殊字符,例如%@ 或#,用于在 NSLog 中进行格式化。如果字符串中的任何一个字符是NSLog的第一个参数,那么格式化所需的参数就越多。
E.G。
NSLog("http://someurl.com/") // this is fine (no special chars used)
NSLog("http://someurl.com/#somehash?x=%@") // this is not fine (%@ is used in URL, NSLog thinks that I'm formatting the string
var someURLString = "http://someurl.com/#somehash?x=%@"
NSLog("%@", someURLString) // this is fine and the way it has to be done
感谢所有看过我问题的人!