2010-11-03 13 views
6

Si no queremos implementar el método init en nuestra clase, y teniendo en cuenta que init en NSObject solo devuelve una instancia del objeto sin inicialización, no veo el punto de llamar a init si ya recibimos la instancia con alloc. Lo intenté y funciona, pero no estoy seguro de que no cause problemas en el futuro.¿Sería correcto/elogioso usar solo alloc sin init?

myClass *newObject = [myClass alloc]; 

en lugar de:

myClass *newObject = [[myClass alloc] init]; 

muchas gracias.

Respuesta

16

No, simplemente llamando al alloc no sería correcto. alloc pone a cero todas las variables de instancia del objeto, init y luego tiene la posibilidad de establecer todas o algunas variables de instancia a sus valores predeterminados. Algunas clases incluso usan sus métodos init para crear otra instancia y devolver esa en lugar de la que usted asignó.

Muchas clases esperan que se llamen a sus métodos init y que posiblemente causarían bloqueos si no llama al init. Si está hablando de una clase personalizada que hereda directamente de NSObject y no necesita inicialización de variables de instancia, puede salirse con la suya con [myClass alloc], pero definitivamente no es un buen estilo de programación.

+0

Muchas gracias por la explicación. "Si está hablando de una clase personalizada que hereda directamente de NSObject y no necesita inicialización de las variables de instancia, puede salirse con [alloc de myClass] pero definitivamente no es un buen estilo de programación". Ese fue mi caso. Respuesta aceptada – toupper

+2

@toupper: Vale la pena mencionar que si quieres una sintaxis más corta, puedes hacer '[myClass new];' que es equivalente a '[[myClass alloc] init];', pero difícilmente podría considerarse en boga . –

2

Creo que no es una buena idea.
Patrón Lee críticas de Cocoa diseño, especialmente la "creación de dos etapas"

También puede leer este artículo http://www.informit.com/articles/article.aspx?p=1398610

+0

Muchas gracias, información útil. – toupper

+0

No entiendo totalmente el punto "Patrón de diseño de cacao - creación de dos etapas": afirma que la creación de dos etapas es mejor porque evita la explosión de "constructores/métodos de clase/métodos de fábrica", pero en comparación con java, no [[Foo alloc] init] igual que Foo f = new Foo(); f.init() ;? –

0

creo que sería no importa mucho si no implementar un "- (id) init "porque si lo hiciera, llamaría al método init de NSObject, que simplemente devuelve el mismo valor que envía al método. Aunque es una buena idea crear su propio método init para establecer su variable de instancia.

Cuestiones relacionadas