titlelabel color buttons objective-c properties initialization lazy-initialization alloc

objective-c - color - titlelabel swift



Instancia perezosa en el desarrollo de Objective-C/iPhone (4)

Pregunta rápida ... Bueno, entiendo que todas las propiedades comienzan como nulas en Objective-C y que el envío de un mensaje a nil no hace nada, por lo tanto, debe inicializar usando [[Asignar clase]]; antes de enviar un mensaje a una propiedad recién creada. Sin embargo, ¿qué pasa si no estoy enviando mensajes a esta propiedad o si configuro la propiedad usando self.property = algo? ¿Necesito asignar init en estos casos también? Además, ¿las propiedades de la interfaz de usuario comienzan como nulas también, como una propiedad de UILabel que arrastra desde su guión gráfico? ¿Necesitan esto init init?

Gracias a todos los que responden


La realidad es que cuando haces self.myProperty = [[Class alloc] init] , no estás inicializando tu propiedad. Más bien, está inicializando un objeto al que le dice a su propiedad (que en realidad es un puntero) que señale. Entonces, si ya tiene un objeto que está asignado e inicializado, no tiene que asignar / init nuevamente y puede hacer self.myProperty = object ;

Las propiedades de la interfaz de usuario no comienzan como nulas, esto se debe a que cuando agrega elementos en el generador de interfaces, la vista es propietaria de los elementos que agrega y estos objetos se inicializan automáticamente. Esto significa que si está creando IBOutlets y conectándolos a algunas propiedades, no tiene que asignar / init.

Espero que esto haya sido útil.


No tengo experiencia con Storyboards, pero sé que cuando creas objetos a través de un archivo xib, todos los objetos tienen una instancia correcta cuando le dices a un controlador de vista que use un archivo xib. Por lo tanto, no debe preocuparse por asignar / iniciar esos objetos en el código.

Con respecto al uso de self.property = <something> , depende de lo que sea something . Si algo es cualquier tipo de objeto existente, no es necesario que realice la asignación init en ese objeto, ya que self.property = ... sintaxis invoca el método de establecimiento de la propiedad que retendrá, copiará, asignará, etc. .

Ahora, cualquier tipo de objeto existente puede ser un objeto de asignación / iniciación, o un objeto lanzado automáticamente obtenido de un método de conveniencia (stringWithFormat de NSString: por ejemplo).

Como señaló Kaan Dedeoglu, self.property = ... sintaxis apunta (y retiene) el ivar al objeto en la memoria, y depende de usted inicializar ese objeto si aún no está instanciado.


No, no es necesario que [[clase asigne] inicie las propiedades en su método de inicio.

Sin embargo, los alentaría a establecerlos explícitamente en Nil en su método de inicio para mayor claridad.


Stunner hizo un buen trabajo al explicar que no es necesario asignar objetos de inicio que ya se han creado.

Pero si es un objeto que no existe, ¿dónde lo va a crear? Un patrón muy común, que menciono porque lo mencionaste en tu publicación, es la ejemplificación perezosa.

Así que quieres una propiedad NSMutableArray. Podría asignarlo en algún método antes de usarlo, pero luego debe preocuparse por "¿se llama a ese método antes de que necesite mi matriz?" o "lo llamaré de nuevo accidentalmente y lo reinicializaré".

Así que un lugar a prueba de fallos para hacerlo es en el captador de la propiedad. Se llama cada vez que accede a la propiedad.

.h @property (nonatomic, strong) NSMutableArray* myArray; .m @synthesize myArray = _myArray; - (NSMutableArray*)myArray { if (!_myArray) { _myArray = [[NSMutableArray alloc] initWithCapacity:2]; } return _myArray; }

Cada vez que accede a esa propiedad, dice: "¿Existe myArray? Si no, créela. Si lo hace, devuelva lo que tengo".

Además, un beneficio adicional con este patrón de diseño es que no está creando recursos hasta que los necesita, en lugar de crearlos todos a la vez, por ejemplo, cuando se carga su controlador de vista o se inicia su aplicación, lo cual, dependiendo de los requisitos, podría llevar un par segundos.