Pregunta

Con ARC, cada asignación de puntero se retiene de forma predeterminada.En ese sentido, en casos noatómicos, ¿por qué necesito declarar propiedades?

¿En qué se diferencian estos dos?

//Property
@interface I1 : NSObject 
@property (nonatomic, strong) NSString* str;
@end

I1 *obj1 = ...;
obj1.str = [[NSString alloc] init...];

//Only member variable
@interface I2 : NSObject { 
@public
    NSString* str;
}
@end
I2 *obj2 = ...;
obj2->str = [[NSString alloc] init...];
¿Fue útil?

Solución

La gestión de la memoria no es la única ventaja de utilizar propiedades.

Dos en particular que me vienen a la mente son:

  1. KVO (sin tener que llamar manualmente a willChangeValueForKey: y didChangeValueForKey:; consulte Notificación de cambio manual )
  2. Capacidad para escribir lógica personalizada para un establecedor y captador, así como para escribir personalizaciones de subclase para el definidor y captador.

bbum escribió una excelente respuesta a esto en iOS: ¿todas las iVar deben ser realmente una propiedad?

Otros consejos

Las propiedades forman parte de la Programación de orientación objetiva .¡Esto es encapsulación!¡¿Cómo no se pueden usar ?!Utilice siempre propiedades para encapsular sus datos.

@ property / @ sintetiza pares que generan automáticamente captadores y definidores y, por lo tanto, permiten encapsulación.

Por supuesto, a menudo esta encapsulación puede no ser necesaria en este momento, pero tal vez en el futuro decida agregar alguna inicialización perezosa a la iVar, o desee publicar una notificación cuando cambie el contenido de la iVar.Es un buen hábito usar siempre propiedades y accesos sintetizados o escritos a mano, y el costo es insignificante.¿Por qué no los usarías?

(Si le preocupa que @ property / @ sintetizar sea demasiado repetitivo y tiene una cuenta de desarrollador de Mac, eche un vistazo al foro Beta).

Creo que las propiedades todavía se usan para generar accesos y mutadores automáticamente donde no se usa @public.

En la interfaz use @property porque es publicidad de acceso público.Si no desea convertirlo en público, coloque la declaración @property en una extensión de clase o la declaración ivar en @implementation en el archivo .m.

En object-c, @property es solo una abreviatura de estándar setter y / o getter de una variable en la clase.Así que no importa si su opción ARC está encendida o apagada, puede hacer su elección a su conveniencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top