El acceso a self.view.frame en loadView provoca la caída de EXC_BAD_ACCESS.

Tengo lo siguiente en un controller de vista (donde webView es una variable de instancia de tipo UIWebView ):

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

La primera línea, que asigna la vista web, causa un locking: obtengo EXC_BAD_ACCESS y un post en la console:

Advertencia: no se puede restaurar el marco seleccionado anteriormente.

No entiendo qué causa el choque; self.view.frame es definitivamente un CGRect .

Dado que está utilizando el método loadView, debe crear manualmente su propia jerarquía de vistas. Como UIWebView es una subclass de UIView, puede escribir su método loadView así:

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

O puede omitir usar loadView y simplemente ubicarlo en el método viewDidLoad así:

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

Para seguir explicando por qué su aplicación se bloquea, cuando se instancia un UIViewController, su vista no se crea correctamente. Esto se llama carga perezosa, por lo que está intentando acceder a un valor que aún no existe.

No puede usar el self.view dentro de loadView, solo puede usar el configurador. La razón es que el método accessor de view en UIViewController carga la vista (si aún no está cargado) y ya que está en loadView (carga la vista) provocará un bucle recursivo infinito.

Si sigues el patrón para loadView a partir de esta respuesta , querrías hacerlo así:

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

Está intentando acceder al marco de la vista sin siquiera crear la vista. Puede crear una vista y asignarla como self.view o simplemente puede llamar a [super loadView] . Prueba el siguiente código.

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

Creo que el self.view.frame no existe cuando se llama a loadView . Puede poner ese código en viewDidLoad , donde se carga el self.view y se conoce el marco.