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

Tom*_*Tom 9 iphone xcode objective-c ios

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

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

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

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

我不明白什么导致了崩溃; self.view.frame绝对是一个CGRect.

pro*_*rmr 7

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

如果你按照这个答案的 loadView模式,你会想要这样做:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];   // don't forget to release
Run Code Online (Sandbox Code Playgroud)


ms8*_*s83 6

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

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];
Run Code Online (Sandbox Code Playgroud)

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

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:webView];
[webView release];
Run Code Online (Sandbox Code Playgroud)

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