Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing self.view.frame in loadView causes EXC_BAD_ACCESS crash

I have the following in a view controller (where webView is an instance variable of type UIWebView):

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

The first line, allocating the web view, causes a crash -- I get EXC_BAD_ACCESS and a message in the console:

Warning: Unable to restore previously selected frame

I don't understand whats causing the crash; self.view.frame is definitely a CGRect.

like image 214
Tom Avatar asked Aug 20 '11 20:08

Tom


2 Answers

You can't use self.view accessor inside loadView, you can only use the setter. The reason is that the view accessor method in a UIViewController loads the view (if it isn't already loaded) and since you are already in loadView (loading the view) it will cause an infinite recursive loop.

If you follow the pattern for loadView from this answer you would want to do it like this instead:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];   // don't forget to release
like image 104
progrmr Avatar answered Oct 29 '22 06:10

progrmr


Since you're using the loadView method you have to manually create your own view hierarchy. Since UIWebView is a subclass of UIView you could just write your loadView method like this:

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

Or you could skip using loadView and just place it in the viewDidLoad method like this:

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

To further elaborate on why your application is crashing, when a UIViewController is instantiated its view is not created right way. This is called lazy loading, so you are trying to access a value that doesn't exist yet.

like image 6
ms83 Avatar answered Oct 29 '22 06:10

ms83