¿Cuáles son las ventajas / desventajas del proceso de inicialización de dos pasos en Objective-C?

Para aclarar: la “inicialización en dos pasos” que describe es en realidad un constructor predeterminado y un constructor de conveniencia opcional, y en realidad tiene un propósito en el lenguaje mismo. En los días previos a ARC, era convencional definir inicializadores de métodos de instancia que siempre devolvían un objeto con un recuento de retención +1, por lo que se garantizaba al llamante una referencia válida. Los inicializadores de conveniencia saltaron a la fama como una forma de eludir esas reglas, y se convirtió en una práctica estándar para ellos devolver un objeto con un recuento de referencia +0, por lo que se convertiría en la responsabilidad de la persona que llama retenerlo o perderlo. Esto hizo que los objetos locales fueran mucho más fáciles de manejar porque ahora se garantizaba que los locales creados con un inicializador de conveniencia se desasignarían a medida que el marco de pila del método se destruyera (en lugar de tener que preocuparse por ‘liberarlo’ al final del método) .

Es fácil combinar los inicializadores de conveniencia y los inicializadores reales, ya que el primero a menudo llama al segundo, pero eso es simplemente un detalle de implementación.

Si desea describir el patrón `+ alloc“ -init`, primero debe comprender que `-init …` no es una inicialización real. `+ alloc` administra la asignación e inicialización de la memoria para un objeto,` -init` existe para realizar cualquier configuración de estado o recursos compartidos. Dicho esto, puede omitir llamadas a `init` y aún así tener un objeto viable la mayor parte del tiempo. Reemplazar `+ alloc` en lugar de` init … `para configurar el estado es una opción viable, aunque la inicialización en dos pasos se ha convertido en una tradición suficiente para que sea mejor escribir un constructor conveniente. Además, ¿quién querría leer `[NSObject alloc]` versus `[NSObject objectWithState:]`?