objective c - ¿Por qué una propiedad declarada usa tanto retención como solo lectura?
objective-c memory-management (2)
Me he dado cuenta de que algunos de los ejemplos de Apple incluyen un modificador de retain
y de readonly
en las propiedades. ¿De qué sirve incluir retain
si no se genera ningún setter cuando estamos usando el modificador de readonly
?
Ejemplo: @property (retain, readonly) NSString *title;
de la muestra AnimatedTableView.
O, más específicamente, (readonly, retain) habilita un patrón como este:
Foo.h:
@interface StuffHolder:NSObject
@property(readonly, retain) MyStuff *stuff;
@end
Foo.m:
@interface StuffHolder()
@property(readwrite, retain) MyStuff *stuff;
@end
@implementation StuffHolder
@synthesize stuff;
@end
El resultado final es una propiedad que es públicamente de solo lectura mientras se lee en la implementación y para quien setter y getter son sintetizados automáticamente por el compilador.
Se podría generar una advertencia en el caso de no anulación (readwrite, retener) en la extensión de la clase, algo parecido a la statement without an effect
, pero sería más confuso que beneficioso. También hay una gran cantidad de casos de bordes diferentes en las combinaciones que igualmente justifican una advertencia, pero en realidad no indican un problema real. Se tomó la decisión de aceptar en gran medida los diversos patrones sin queja por simplicidad (ya que no son cuestiones de corrección).
Puede incluir una segunda declaración de lectura privada en una extensión de clase. El esquema de gestión de la memoria para todas las referencias necesita coincidir con IIRC, por lo que tiene tonterías como "solo lectura, retener".