在loadView中访问self.view.frame会导致EXC_BAD_ACCESS崩溃

时间:2011-08-20 20:26:19

标签: iphone objective-c ios xcode

我在视图控制器中有以下内容(其中webViewUIWebView类型的实例变量):

- (void)loadView
{
    webView = [[UIWebView alloc]initWithFrame:self.view.frame];
    [self.view addSubview:webView];
}

分配Web视图的第一行导致崩溃 - 我在控制台中收到EXC_BAD_ACCESS和消息:

  

警告:无法恢复以前选择的框架

我不明白导致事故的原因; self.view.frame绝对是CGRect

4 个答案:

答案 0 :(得分:7)

您无法在loadView中使用self.view 访问者,您只能使用setter。原因是UIViewController中的view访问器方法加载了视图(如果它尚未加载),并且由于您已经在loadView中(加载视图),它将导致无限递归循环。

如果你按照loadView from this answer的模式进行操作,你会想要这样做:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];   // don't forget to release

答案 1 :(得分:6)

由于您使用的是loadView方法,因此必须手动创建自己的视图层次结构。由于UIWebView是UIView的子类,因此您可以像这样编写loadView方法:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];

或者您可以跳过使用loadView并将其放在viewDidLoad方法中,如下所示:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:webView];
[webView release];

为了进一步详细说明应用程序崩溃的原因,在实例化UIViewController时,其视图不是正确创建的。这称为延迟加载,因此您尝试访问尚不存在的值。

答案 2 :(得分:1)

您试图访问视图的框架,甚至不创建视图。您可以创建一个视图并将其指定为self.view,也可以只调用[super loadView]。请尝试以下代码。

- (void)loadView {

    [super loadView];
    webView = [[UIWebView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:webView];
}

答案 3 :(得分:0)

我认为调用self.view.frameloadView不存在。您可以将该代码放在viewDidLoad中,其中self.view已加载且已知帧。