应用程序在释放视图控制器对象时崩溃

时间:2012-08-23 06:48:51

标签: ios viewcontroller

我的应用在释放视图控制器对象时崩溃。 这是我的代码。

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;
}
  • (void)openURL:(NSURL *)URL { NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:URL]; [_webView loadRequest:request]; }

3 个答案:

答案 0 :(得分:1)

更新:以下答案是对原始问题的回答,即UIViewController UIWebView未显示的原因。 OP的原始理论是它与视图控制器对象过早释放的一些问题有关。但是,正如我在下面的回答中所述,我怀疑问题与视图控制器本身的创建有关。无论如何,我对原始问题的回答如下(但遗憾的是与修订后的问题无关):

  

我个人并不怀疑这个问题与该问题有什么关系   释放控制器。我认为这是在创造   控制器的观点。上面的代码中没有任何内容导致   要释放的对象,所以你需要在其他地方停留问题   显示更多代码。如果您担心通知中心   东西,尝试绕过它,只需添加一个按钮,做你的   TagCloudWebViewController alloc / init,设置htmlString并推送,   并查看是否仍然导致程序崩溃,我怀疑它   将

     

我注意到您是通过allocinit创建控制器的,   但不是initWithNibNamed。根据{{​​3}}:   “如果您无法在故事板或nib文件中定义视图,   覆盖loadView方法以手动实例化视图   层次结构并将其分配给视图属性。“

     

所以,底线,要么使用NIB,要么使用故事板,要么定义一个   loadView。定义viewDidLoad并不排除需要a   loadView。您需要为控制器创建一个视图,即   如果您使用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];

}

由于上面的代码,我的崩溃已经解决了

相关问题