objective c - programación - Objective-C:(propiedades privadas/públicas) que hace una propiedad de solo lectura para llamadas de clase externa y readwrite para auto llamadas
versiones de objective c (4)
¿Conoces una manera de hacer una propiedad de solo lectura para llamadas externas y de lectura para llamadas internas?
He leído hace tiempo algo que me pareció
En el .h
@property(nonatomic, readonly) NSDate* theDate;
En ellos
@interface TheClassName()
@property(nonatomic, retain) NSDate* theDate;
@end
pero esto genera una advertencia cuando se compila el .m "Propiedad del atributo Fecha en la clase de clase de continuación de clase no coincide con la clase de propiedad Clase de clase".
De todos modos, parece funcionar (puede leer pero no establecer desde fuera de la clase, puede hacer ambas cosas desde adentro) pero debería haberme perdido algo para evitar la advertencia. O si conoce una mejor manera de hacer esto ...
En .m, no debería poner @property nuevamente. Aunque no estoy seguro del efecto que tiene. ¿Querías usar @synthesize?
Tenga en cuenta que theDate será de lectura / escritura dentro de la implementación de la clase de todos modos, independientemente de ser de solo lectura para el mundo exterior.
En tu .h:
@property(nonatomic, retain, readonly) NSDate* theDate;
En tu .m:
@interface TheClassName()
@property(nonatomic, retain, readwrite) NSDate* theDate;
@end
Este problema se elimina en gran medida si se muda a ARC. En lugar de dos declaraciones de propiedad, la declararía una vez en el encabezado.
@property(nonatomic, readonly) NSDate* theDate;
Y luego en la extensión de clase, simplemente declara una variable de instancia __strong.
@interface TheClassName()
{
__strong NSDate* _theDate;
}
@end
Y sintetizarlos apropiadamente en la implementación
@implementation TheClassName
@synthesize theDate = _theDate;
Ahora puedes establecer la variable de instancia.
_theDate = [NSDate date];
Y ARC alineará mágicamente la funcionalidad apropiada de retención / liberación en su código para tratarla como una variable fuerte / retenida. Esto tiene la ventaja de ser más rápido que las propiedades de estilo antiguo (retención), así como ARC enmarca el código de retención / liberación en el momento de la compilación.
Si la propiedad está respaldada por una variable, la variable es lectura-escritura desde el interior de la clase. Haga que la propiedad sea de solo lectura y se cumplirá su objetivo de diseño. Dentro de la clase, consulte la variable sin anteponerse a self.
.