在访问的loadView导致self.view.frame EXC_BAD_ACCESS崩溃
我已经在视图控制器的以下(其中webView
是UIWebView
类型的实例变量):在访问的loadView导致self.view.frame EXC_BAD_ACCESS崩溃
- (void)loadView
{
webView = [[UIWebView alloc]initWithFrame:self.view.frame];
[self.view addSubview:webView];
}
第一行,分配web视图,导致系统崩溃 - 我得到EXC_BAD_ACCESS并在控制台消息:
警告:无法恢复先前选择的帧
我不明白什么导致崩溃; self.view.frame
绝对是CGRect
。
由于您使用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被实例化时,它的视图不是以正确的方式创建的。这被称为延迟加载,因此您正尝试访问尚不存在的值。
你不能使用self.view
访问器里面loadView,你只能使用setter。原因是UIViewController中的访问器方法会加载视图(如果它尚未加载),并且由于您已经在loadView(加载视图)中,它将导致无限递归循环。
如果按照from this answer你会想这样做,这样反而对的loadView模式:
webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release]; // don't forget to release
我觉得self.view.frame
时loadView
被称为不存在。您可以将该代码放入viewDidLoad
,其中self.view
已加载并且帧已知。
您正尝试访问视图的帧而不创建视图。您可以创建视图并将其分配为self.view
,或者您可以简单地拨打[super loadView]
。尝试下面的代码。
- (void)loadView {
[super loadView];
webView = [[UIWebView alloc] initWithFrame:self.view.frame];
[self.view addSubview:webView];
}
Docs建议不要致电超级 –
@Brad Thomas,真的吗?我不这么认为。 – EmptyStack
https://developer.apple.com/library/ios/Documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#jumpTo_61 –
你最好总是提供崩溃日志。很难说没有它。 – Anton
控制台显示“警告:无法恢复先前选定的框架”。并且分配UIWebView的代码行以绿色突出显示,并显示为“EXC_BAD_ACCESS”。 – Tom