Iphone 当我在加载网络视图时按下导航栏上的后退键时,我的应用程序崩溃了。。。?

Iphone 当我在加载网络视图时按下导航栏上的后退键时,我的应用程序崩溃了。。。?,iphone,uiwebview,loading,back,Iphone,Uiwebview,Loading,Back,我的iphone应用程序中有一个带有导航栏的视图。导航栏上有一个后退按钮,可以转到上一个视图。视图中有一个webview。如果用户按下导航栏上的“后退”按钮时正在加载webview,则应用程序将崩溃,并显示错误消息: [WebViewController respondsToSelector:]: message sent to deallocated instance 我假设我在视图卸载时发布了一些东西。我相信我的viewWillDisapear方法会阻止webview加载。。。但是,当我在

我的iphone应用程序中有一个带有导航栏的视图。导航栏上有一个后退按钮,可以转到上一个视图。视图中有一个webview。如果用户按下导航栏上的“后退”按钮时正在加载webview,则应用程序将崩溃,并显示错误消息:

[WebViewController respondsToSelector:]: message sent to deallocated instance
我假设我在视图卸载时发布了一些东西。我相信我的viewWillDisapear方法会阻止webview加载。。。但是,当我在视图未完全加载时按back键时,它仍会崩溃

当我让视图在大约20%的时间内完成加载时,似乎会发生这种情况——并且只有在页面完成加载后,我真正快速地按下后退按钮时才会发生这种情况

以下是我相信在这场恶作剧中运行的代码

- (void)viewDidLoad {
     [super viewDidLoad];
     webView.scalesPageToFit = YES;
    [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: url]]];
    [addressBar setText:url];
}
然后在加载webview时:

- (void)webViewDidStartLoad:(UIWebView *)webView {

if (first) {
   //mtns is a uiimageview
    mtns.alpha = .8;
    first = NO;
}
[activityIndicator startAnimating];
}
在提出建议后,我添加了以下方法:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.webView stopLoading];
    self.webView.delegate = nil;
}
我不知道它为什么会崩溃,所以我有点不知所措

谢谢


R

您可以覆盖
-视图将消失:
以停止加载UIWebView并将委托设置为nil

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.webView stopLoading];
    self.webView.delegate = nil;
}

这可能是因为您在ViewWillMissier应用程序中编写的执行代码尚未崩溃。请尝试放置断点并检查是否调用ViewWillMissier方法。如果未调用ViewWillMissier方法,请在应用程序导航到第二个视图控制器之前编写mark建议的代码

在web视图消失之前,必须确保将其委托属性设置为nil。在您的dealocviewDidUnload方法中都可以这样做,因为在dealoc之前并不总是调用viewDidUnload。发生的情况是,在解除分配视图控制器后,web视图仍然有对其地址的引用,并试图向其发送消息(-respondsToSelector:)

- (void)dealloc {
    webView.delegate = nil;
   [super dealloc];
}

- (void)viewDidUnload {
    webView.delegate = nil;
    [super viewDidUnload];
}