2012-01-30 18 views
20

Desea saber más sobre las diferencias prácticas entre init y initWithNibName. Las respuestas SO tales como this sugieren que es mejor llamar "initWithNibName" indirectamente a través de "init".UIViewController (init y initWithNibName)

  1. ¿Hay alguna circunstancia que necesitamos para definir "init" y "initWithNibName" de manera diferente?
  2. ¿Es posible que cualquier archivo Nib necesite cargarse más de una vez durante la ejecución de un solo programa?
  3. Son preguntas 1 & 2 interrelacionadas?

Respuesta

30

No mejor llamar initWithNibName: indirectamente a través de init es . Solo quiere llamar al initWithNibName: en algún momento. Puedes hacerlo externa o internamente. Algunas personas piensan que es mejor hacerlo internamente. De hecho, tengo una clase llamada "LayoutUtil" que mantengo métodos de ayuda relacionados con el diseño para evitar escribir una y otra vez tediosa pieza de código relacionado con el diseño. Aquí está mi código para cargar un UIViewController:

+ (id)loadController:(Class)classType { 
    NSString *className = NSStringFromClass(classType); 
    UIViewController *controller = [[classType alloc] initWithNibName:className bundle:nil]; 
    return controller; 
} 

Y entonces yo sólo puedo hacer:

MyViewController *c = [LayoutUtil loadController:[MyViewController class]]; 

Si lo desea, puede añadir un método llamado ughhhh a una clase y lo llaman allí, no importa en absoluto. El punto es que no es una mejor práctica llamar a initWithNibName en el método init, solo debes asegurarte de llamarlo en algún momento al iniciar un UIViewController.

- (id)ughhhh 
{ 
    self = [super initWithNibName:@"Myview" bundle:nil]; 
    if (self != nil) 
    { 
    } 
    return self; 
} 

Un archivo de punta definitivamente necesita cargarse más de una vez. Cada vez que llamas a initWithNibName en un UIViewController, tienes que cargar el xib. Mucha gente carga UIViews que no son propiedad de un UIViewController como esto:

[[NSBundle mainBundle] loadNibNamed:@"nameOfXIBFile" owner:self options:nil]; 

Cada vez que se llama a esta función se le cargando la punta.

Existen ciertos casos en los que se puede almacenar en caché un plumín. Un ejemplo sería una UITableView, pero la vista de tabla implementa su propio caché. El sistema operativo no está haciendo caché automáticamente.

init y initWithNibName: están relacionados en que initWithNibName: llama automáticamente a init en un objeto.

+1

+1, muy bien detallado ... – doNotCheckMyBlog

+0

, gracias por su respuesta detallada y amable asistencia ... – Stanley

+1

Sólo una nota: para asignar a uno mismo, es necesario tener un método que comience con 'init'. Entonces '- (id) initUghhhh' – benaneesh

2

respuesta de la primera pregunta

Lo ideal sería que cada initWithNibName llamadas init internamente de modo que no es necesario definir tanto en los casos normales, pero puede hacerlo si View también se carga desde loadView en un caso y el fron plumilla como bien en otro caso desde diferentes Vistas.

respuesta de la Segunda pregunta

Cada vez que Vista se empuja en la pila de plumilla se carga

respuesta de Tercera pregunta

Sin

+0

Gracias por su respuesta y asistencia en especie ... – Stanley

10

No es "mejor llamar" initWithNibName "indirectamente a través de" init "'. Debe usar el que mejor se adapte a sus necesidades. Decir [[UIViewController alloc] init] es exactamente como decir [[UIViewController alloc] initWithNibName:nil bundle:nil], por lo que si esos son los argumentos que desea aprobar, también podría usar [[UIViewController alloc] init].

En respuesta a sus preguntas:

  1. Puede definir init y initWithNibName:bundle: diferente si así lo desea. Puede definir solo uno de ellos. Por ejemplo, UIImagePickerController solo define init, y si intenta enviarlo initWithNibName:bundle:, no funcionará correctamente. O puede definir algún método totalmente diferente init.... Por ejemplo, UINavigationController solo define initWithRootViewController:. Cualquier método de init que defina debe eventualmente llamar a uno de los métodos de inicio de su superclase.

  2. Sí, una punta se puede cargar varias veces. Si crea varias instancias de la misma subclase de controlador de vista, es probable que cargue el mismo plumín varias veces. De hecho, es posible que una instancia de solo de un controlador de vista cargue su plumilla varias veces. ¿Cómo? Si la vista de un controlador de vista no está actualmente en la pantalla, y el sistema tiene poca memoria, el sistema le pedirá al controlador de vista que libere su vista. Si el controlador de vista más tarde necesita volver a colocar su vista en la pantalla, cargará la punta de nuevo.

  3. Las preguntas 1 y 2 no están relacionadas.

+0

Gracias por su respuesta detallada y amable ayuda ... – Stanley

Cuestiones relacionadas