0

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

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 委托方法

-(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]; }
4

3 回答 3

1

更新:以下答案是对为什么UIViewControllerwith aUIWebView没有出现的原始问题的回应。OP 最初的理论是它与视图控制器对象的过早释放有关的一些问题有关。但是,正如我在下面的回答中所述,我怀疑问题与视图控制器本身的创建有关。无论如何,我对原始问题的回答如下(但不幸的是,它与修改后的问题无关):

我个人不怀疑这个问题与控制器的释放有关。我认为这是在创建控制器的视图。上述代码中没有任何内容会导致对象被释放,因此您的问题在于其他地方,您需要显示更多代码。如果您担心通知中心的内容,请尝试绕过它,只需添加一个按钮来执行您的 TagCloudWebViewController分配/初始化、设置htmlString和推送,看看是否仍然会导致您的程序崩溃,我怀疑它会崩溃。

我注意到您正在通过allocand创建控制器init,但不是initWithNibNamed。根据UIViewController 类参考:“如果您无法在情节提要或 nib 文件中定义视图,请覆盖该loadView方法以手动实例化视图层次结构并将其分配给视图属性。”

因此,底线是使用 NIB、使用情节提要或定义 loadView. 定义 aviewDidLoad并不排除对 a 的需要 loadView。您需要为您的控制器创建一个视图,如果您使用 NIB 或情节提要,则为您完成,或者loadView如果您不使用 NIB 或情节提要,则必须通过手动完成。

请参阅 iPhone SDK:loadView 和 viewDidLoad 有什么区别?viewDidLoad讨论和 之间的差异loadView

于 2012-08-23T09:30:02.867 回答
0

我没有看到任何导致崩溃的东西。我认为你已经改变了你的问题。根据你没有在任何地方使用 ViewController 的问题。请显示更多详细信息。

更新:请检查,您正在创建自动释放的对象,可能是您错误地释放了一些地方。尽量避免自动释放的对象保留在池中和以后的版本中,这可能会导致您的内存问题。

于 2012-08-23T07:29:24.623 回答
0

上述问题是由于 WebView delgate 引起的。按下后退按钮后,对象的引用正在从内存中释放,因为此应用程序在释放视图控制器对象时崩溃。我做了一些类似的事情

-(void) viewDidDisappear:(BOOL)animated{
if([_webView isLoading]) {
    [_webView stopLoading];
}
[_webView setDelegate:nil];

}

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

于 2012-08-24T07:15:19.173 回答