Ios 应用程序在释放视图控制器对象时崩溃
我的应用程序在释放view controller对象时崩溃。 这是我的密码Ios 应用程序在释放视图控制器对象时崩溃,ios,viewcontroller,Ios,Viewcontroller,我的应用程序在释放view controller对象时崩溃。 这是我的密码 TagCloudWebViewController *controller=[[[TagCloudWebViewController alloc]init]autorelease]; controller.htmlString=[[notification userInfo] valueForKey:@"url"]; [self.navigationController pushViewController:contro
TagCloudWebViewController *controller=[[[TagCloudWebViewController alloc]init]autorelease];
controller.htmlString=[[notification userInfo] valueForKey:@"url"];
[self.navigationController pushViewController:controller animated:YES];
这是我调用上述方法时的代码
-(void)viewDidLoad{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(openTextInWebview:) name:@"kTouchTextUrl" object:Nil];
}
及
WebView delgate方法
-(void) webViewDidStartLoad:(UIWebView *)webView {
self.navigationItem.title = @"Loading...";
[spinnerView startAnimating];
isLoading = YES;
}
- (无效)openURL:(NSURL*)URL{ NSMutableURLRequest*请求=[NSMutableUrlRequestRequestWithURL:URL]; [_webviewloadrequest:request]; }
更新:请检查,您正在创建自动删除对象,可能是您在错误的地方释放了一些对象。请尽量避免自动删除对象,因为它保留在池中以及以后的版本中,这可能会导致内存问题。更新:以下答案是对原始问题的回答,即为什么带有
UIWebView
的UIViewController
没有出现。OP最初的理论是,它与视图控制器对象的过早释放有关。但是,正如我在下面的回答中所概述的,我怀疑问题与视图控制器本身的创建有关。无论如何,我对原问题的回答如下(但不幸的是,这与修改后的问题无关):
我个人并不怀疑这个问题与
释放控制器。我认为这是在创造
控制器的视图。上面的代码中没有导致
对象,所以问题就在别处,您需要
显示更多代码。如果您担心您的通知中心
东西,尝试绕过它,只需添加一个按钮,你的
TagCloudWebViewController
alloc/init,设置htmlString
并按下,
看看这是否仍然会导致你的程序崩溃,我怀疑是这样
威尔
我注意到您正在通过alloc
和init
创建控制器,
但不是initWithNibNamed
。根据报告:
“如果无法在故事板或nib文件中定义视图,
重写loadView
方法以手动实例化视图
层次结构并将其指定给视图属性。“
所以,底线是,要么使用笔尖,要么使用故事板,要么定义
loadView
。定义viewDidLoad
并不排除需要
loadView
。您需要为控制器创建一个视图,即
如果您使用NIB或故事板,或者您必须手动执行,则为您完成
如果您不使用NIB或故事板,请通过loadView
看
有关viewDidLoad
和
loadView
上述问题是由于WebView delgate引起的。按下“后退”按钮后,对象的引用将从内存中解除分配,因为此应用程序在释放viewcontroller对象时崩溃。我做了一些类似的事情
-(void) viewDidDisappear:(BOOL)animated{
if([_webView isLoading]) {
[_webView stopLoading];
}
[_webView setDelegate:nil];
}
由于上述代码,我的崩溃已经解决了
你可能想考虑切换到ARC。无论如何:在你的代码中,控制器是自动释放的-如果你以后在代码中释放它,它肯定会崩溃。我不明白你的意思,请解释。当应用程序崩溃时,控制台中显示了什么?您能否在问题中添加这一点,然后最好回答***-[TagCloudWebViewController respondsToSelector:]:消息已发送到取消分配的实例0x8595b90,在上获取此错误消息console@Rob我也尝试过使用release,但我正在解决崩溃问题,直到加载web视图后web视图未加载,它崩溃并给出相同的mesage***-[TagCloudWebViewController respondsToSelector:]:消息已发送到解除分配的实例0x8595b90@Nishi如果我理解正确的话,视图现在显示得很好,但加载完成后会崩溃。如果是这样,您显然必须为UIWebViewDelegate
方法共享代码。(顺便说一句,你已经彻底改变了你的问题,这是令人气馁的,因为它会使所有答案无效(这使后来蹒跚而行的其他人很难弄清楚发生了什么,因为在考虑新修订的问题时,答案毫无意义).将来,你可能想避免对你的问题进行根本性的改变。)解决了我的问题。这是由于WebView委托造成的。我在viewWillopser方法中使用了webvie.delgate=nil。崩溃问题解决。谢谢大家
-(void) webViewDidStartLoad:(UIWebView *)webView {
self.navigationItem.title = @"Loading...";
[spinnerView startAnimating];
isLoading = YES;
-(void) webViewDidFinishLoad:(UIWebView*)webView {
self.navigationItem.title = [_webView stringByEvaluatingJavaScriptFromString:@"document.title"];
[self performSelector:@selector(stopSpinner) withObject:nil afterDelay:0.1];
isLoading = NO;
}
-(void) webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error {
[self webViewDidFinishLoad:webView];
[self performSelector:@selector(stopSpinner) withObject:nil afterDelay:0.1];
isLoading = NO;
}
-(void) viewDidDisappear:(BOOL)animated{
if([_webView isLoading]) {
[_webView stopLoading];
}
[_webView setDelegate:nil];