Después de revisar el desarrollador de iPhone para principiantes y leer el código de muestra en línea, me he dado cuenta de que la mayoría de los programadores de Objective C sintetizan casi todas las variables de instancia. Algunas variables son convenientes para hacer snythesize, pero la mayoría no debería hacerlo si se respeta el principio de encapsulación orientado a objetos. Lo peor son las propiedades sintetizadas marcadas como privadas. Un programador de C++ que intente usar el código de otra persona leerá los campos públicos y los métodos en el archivo de encabezado. Se saltearán las variables privadas. Este programador de C++ no sabrá que pretendía que las propiedades privadas se usen de alguna manera significativa.¿Es una propiedad sintetizada privada un oxímoron?
Echa un vistazo a esta plantilla de muestra en lazy table image loading proporcionado por Apple:
Cabecera
@interface ParseOperation : NSOperation <NSXMLParserDelegate>
{
@private
id <ParseOperationDelegate> delegate;
NSData *dataToParse;
NSMutableArray *workingArray;
AppRecord *workingEntry;
NSMutableString *workingPropertyString;
NSArray *elementsToParse;
BOOL storingCharacterData;
}
Fuente
@interface ParseOperation()
@property (nonatomic, assign) id <ParseOperationDelegate> delegate;
@property (nonatomic, retain) NSData *dataToParse;
@property (nonatomic, retain) NSMutableArray *workingArray;
@property (nonatomic, retain) AppRecord *workingEntry;
@property (nonatomic, retain) NSMutableString *workingPropertyString;
@property (nonatomic, retain) NSArray *elementsToParse;
@property (nonatomic, assign) BOOL storingCharacterData;
@end
@implementation ParseOperation
@synthesize delegate, dataToParse, workingArray, workingEntry, workingPropertyString, elementsToParse, storingCharacterData;
Ahora sé que esto no es C++ y nos no debe suponer que todas las prácticas de C++ deben cumplirse en el Objetivo C. B El Objetivo C debería tener buenas razones para alejarse de las prácticas de programación general.
- Por qué son todos los Ivars privadas sintetizados? Cuando observa el proyecto como un todo, solo
NSMutableArray *workingArray
es utilizado por clases externas. Entonces ninguno de los otros ivars debería tener setters y getters. - ¿Por qué se sintetizan ivars muy sensibles? Por ejemplo, ahora que
id delegate
tiene un setter, el usuario de este objeto puede cambiar el delegado en medio del análisis XML, algo que no tiene sentido. Además,NSData *dataToParse
son datos XML brutos recuperados de la red. Ahora que tiene un setter, el usuario de este objeto puede corromper los datos. - ¿Cuál es el punto de marcar todo
private
en el encabezado? Como todos los ivars se sintetizan para tener getters/setters, son efectivamente públicos. Puede configurarlos para cualquier cosa que desee y puede obtener su valor siempre que lo desee.
Hubo algunas preguntas similares a esta ayer: [Public read, private retain] (http://stackoverflow.com/questions/5788458/public-read-private-retain-property); [¿Una propiedad @ privada crea un ivar privado]? (Http://stackoverflow.com/questions/5784875/does-a-private-property-create-an-private-instance-variable) No estoy seguro de si de ellos responde tus preguntas sin embargo. –
También le puede interesar esto: [iOS: ¿debe ser cada iVar realmente propiedad?] (Http://stackoverflow.com/questions/5031230/ios-must-every-ivar-really-be-property) –