我的应用在释放视图控制器对象时崩溃。 这是我的代码。
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];
}
和
#pragma mark - UIGestureDelegate
- (void)longPressRecognized:(UILongPressGestureRecognizer *)longPressRecognizer {
CGPoint touchPoint = [longPressRecognizer locationInView:self];
NSArray *subviews = self.subviews;
for (int i=0; i<subviews.count; i++) {
TagView * tagLabel = (TagView *)[subviews objectAtIndex:i];
if ( CGRectContainsPoint( [tagLabel frame], touchPoint ) ) {
NSArray*objectArray=[[[NSArray alloc] initWithObjects:tagLabel.customLink, nil] autorelease];
NSArray*keyArray=[[[NSArray alloc] initWithObjects:@"url", nil] autorelease];
NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:objectArray forKeys:keyArray ];
[[NSNotificationCenter defaultCenter] postNotificationName:@"kTouchTextUrl" object:nil userInfo:userInfo];
//[[UIApplication sharedApplication] openURL:[NSURL URLWithString: tagLabel.customLink]];
break;
}
}
}
这是通知方法
DidLoad方法
- (void) viewDidLoad {
[super viewDidLoad];
_webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
_webView.delegate = self;
_webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth
| UIViewAutoresizingFlexibleHeight);
_webView.scalesPageToFit = YES;
[self.view addSubview:_webView];
[self initSpinner];
if (htmlString) {
[self openURL:[NSURL URLWithString:htmlString]];
}
}
WebView delgate方法
-(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;
}
答案 0 :(得分:1)
更新:以下答案是对原始问题的回答,即UIViewController
UIWebView
未显示的原因。 OP的原始理论是它与视图控制器对象过早释放的一些问题有关。但是,正如我在下面的回答中所述,我怀疑问题与视图控制器本身的创建有关。无论如何,我对原始问题的回答如下(但遗憾的是与修订后的问题无关):
我个人并不怀疑这个问题与该问题有什么关系 释放控制器。我认为这是在创造 控制器的观点。上面的代码中没有任何内容导致 要释放的对象,所以你需要在其他地方停留问题 显示更多代码。如果您担心通知中心 东西,尝试绕过它,只需添加一个按钮,做你的
TagCloudWebViewController
alloc / init,设置htmlString
并推送, 并查看是否仍然导致程序崩溃,我怀疑它 将我注意到您是通过
alloc
和init
创建控制器的, 但不是initWithNibNamed
。根据{{3}}: “如果您无法在故事板或nib文件中定义视图, 覆盖loadView
方法以手动实例化视图 层次结构并将其分配给视图属性。“所以,底线,要么使用NIB,要么使用故事板,要么定义一个
loadView
。定义viewDidLoad
并不排除需要aloadView
。您需要为控制器创建一个视图,即 如果您使用NIB或故事板,则为您完成,或者您必须手动完成 如果你不使用NIB或故事板,请通过loadView
。请参阅 UIViewController Class Reference 讨论
viewDidLoad
和...之间的差异loadView
。
答案 1 :(得分:0)
我没有看到任何导致崩溃的事情。我认为你已经改变了你的问题。根据问题,你没有在任何地方使用ViewController。请显示更多细节。
已更新:请检查,您正在创建自动释放的对象,可能是您正在错误地释放某些位置。请尝试避免自动释放的对象,因为它保留在池和更高版本中,这可能会导致你的记忆问题。
答案 2 :(得分:0)
由于WebView delgate,会出现上述问题。按下后退按钮后,对象的引用将从内存中释放,因为此应用程序在释放viewcontroller对象时崩溃。我做了一些像
这样的事情-(void) viewDidDisappear:(BOOL)animated{
if([_webView isLoading]) {
[_webView stopLoading];
}
[_webView setDelegate:nil];
}
由于上面的代码,我的崩溃已经解决了