保留viewcontroller - 发送到解除分配的实例的消息

时间:2014-04-07 21:19:54

标签: ios objective-c automatic-ref-counting

我正在尝试使用UIWebViewDelegate,但是,当我将委托设置为自己的时候,我收到一条'消息已发送到解除分配的实例'错误。

实际错误:“2014-04-07 22:12:05.402 AppName[746:60b] -[WebViewController respondsToSelector:]: message sent to deallocated instance 0xa47ae00"

我认为这是因为没有保留WebViewController实例?

有人能指出我正确的方向吗?

我的结构是: RootViewController> WebViewController(委托)> web视图

// root.h
@interface RootViewController : UIViewController
@property (strong, nonatomic) WebViewController * webViewController;
@end

// root.m

#import "RootViewController.h"
#import <UIKit/UIKit.h>
#import "WebViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad
{

    _webViewController = [[WebViewController alloc] init];

    [self.view addSubview:_webViewController.view];

}

@end

// .h

#import <UIKit/UIKit.h>

@interface WebViewController : UIViewController <UIWebViewDelegate>
@property(strong) UIWebView *webView;
@end

// .m

#import "WebViewController.h"

@interface WebViewController ()
@end

@implementation WebViewController

- (void)viewDidLoad
{
    _webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    _webView.delegate = self;
    NSString *url = @"http://google.com/";
    NSURL *nsurl = [NSURL URLWithString:url];
    NSURLRequest *nsrequest = [NSURLRequest requestWithURL:nsurl];
    [_webView loadRequest:nsrequest];
    [self.view addSubview:_webView];
}

-(void)webViewDidStartLoad:(UIWebView *)webView {
    NSLog(@"ui web view started load");
}

2 个答案:

答案 0 :(得分:1)

尝试将您的代码从loadView移到viewDidLoad,然后移除您对loadView的来电。我相信在实例化和显示视图控制器时会自动调用loadView,因此再次调用它可能会导致您实例化webview两次。

来自文档:

  

你永远不应该直接调用这个方法。视图控制器调用   请求view属性但当前为nil时此方法。   此方法加载或创建视图并将其分配给视图   属性。

答案 1 :(得分:0)

我没有像这样设置根视图控制器:

    self.window.rootViewController = rootController;