2011-01-28 18 views
5

Problema muy interesante al usar loadView en UIViewController.Bucle infinito al usar loadView

Por lo general utilizamos como esta manera

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    NSLog(@"loadview"); 
    [super loadView]; 
} 

Si eliminar

[super loadView]; 

Obtendremos bucle muertos con este

- (void)loadView { 
    NSLog(@"loadview"); 

} 

¿Por qué?

Respuesta

4

Dado que solo está HEREDIZANDO lo que se está implementando en super clase (UIViewController), si no llama a los supermétodos, entonces la implementación que debe hacerse NO se hace.

Casi todos los métodos súper hacer algo crítico y la clase local heredar implementaciones súper clase o bien debe reemplazar a todos juntos (a menos que sepa todo acerca de lo que lo hace súper haciendo referencia a la documentación, que nunca es una buena idea), o simplemente ADD implementación de clase local a las implementaciones de superclase heredadas.

En conclusión, cada vez que herede una clase, que es en la mayoría de los casos de desarrollo de software, debe dejar que la superclase realice sus implementaciones a menos que sea seguro anularlas.

Si estoy en lo cierto, parece que super loadView implementa algo muy crítico para evitar el ciclo.

NOTA ADICIONAL: Sin embargo, en base a la documentación, que no debe llamada súper método: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html Probablemente, la razón de bucle infinito es causada por no implementar view propiedad adecuada.

9

Solo una forma de hacer bucle infinito en este caso es obtener la propiedad de vista hasta que no esté configurada. Si se escribe al lado (por ejemplo):

- (void)loadView { 
    self.view = [[UIView alloc] initWithFrame:self.view.bounds]; 
} 

Obtendras un bucle infinito, pero

- (void)loadView { 
    self.view = [[UIView alloc] initWithFrame:CGRectZero]; 
} 

funciona bien.

De modo que no puede acceder a la propiedad de visualización hasta que no la configuró.

2

Si reemplaza a loadView, se espera que proporcione una vista raíz para la jerarquía de vista del controlador. Si no lo proporciona, se llamará a loadView cada vez que se haga referencia a la vista, lo que posiblemente conduzca a un ciclo infinito. De los documentos:

Si especifica las vistas manualmente, debe implementar el método loadView y usarlo para asignar un objeto de vista raíz a la propiedad de vista.

implementaciones que podrían causar un bucle infinito:

- (void)loadView { 
    NSLog(@"loadview"); 
} 

... Yo.vista es nula después de loadView

- (void)loadView { 
    self.view; // Or anything that references self.view 
} 

... referencia self.view causa loadView que se invoca, por lo tanto, un bucle infinito.

correcta:

- (void)loadView { 
    self.view = [[UIView alloc] init]; 
    if (self.view == nil) { 
     [super loadView]; // Try to load from NIB and fail properly, also avoiding inf. loop. 
    } 
} 
+1

Esta es la respuesta correcta, no el marcado como aceptado – Pascal