Tom
Tom

Reputation: 269

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.

Upvotes: 9

Views: 4971

Answers (4)

ms83
ms83

Reputation: 1814

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.

Upvotes: 6

progrmr
progrmr

Reputation: 77251

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

Upvotes: 7

EmptyStack
EmptyStack

Reputation: 51374

You are trying to access view's frame without even creating the view. You can create a view and assign it as self.view or you can simply call [super loadView]. Try the below code.

- (void)loadView {

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

Upvotes: 1

Zhao Xiang
Zhao Xiang

Reputation: 1643

I think the self.view.frame does not exist when loadView is called. You may put that code in viewDidLoad, where the self.view is loaded and frame known.

Upvotes: 0

Related Questions