2012-08-01 15 views
8

Soy nuevo en Objective-C y XCode, pero me alegré de ver que XCode 4.4 automáticamente sintetiza mis propiedades para mí, ahora. Me imagino que esto significa que ya no tengo que escribir @synthesize para mis propiedades, y que puedo acceder a ellas usando self.propertyName = @"hi";, por ejemplo.¿Cómo funciona la propiedad automática de sintetizar en xcode 4.4?

Estoy intentando volver a escribir un código de ejemplo para poder entenderlo mejor, pero este código implementa un método getter personalizado. En el código de ejemplo, la propiedad se sintetiza manualmente, como @synthesize managedObjectContext = __managedObjectContext;. El captador de costumbre se ve así:

- (NSManagedObjectContext *)managedObjectContext { 
    if (__managedObjectContext != nil) { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 

    return __managedObjectContext; 
} 

En el código de esta persona, veo que acaba de usar su descriptor de acceso sintetizado de forma manual para obtener y establecer tanto. Pensé en mi código, podría simplemente reemplazar el __managedObjectContext con self.managedObjectContext, pero no. Si hago esto, aparece un error que me dice que estoy tratando de asignar a una propiedad readonly. Esto tiene sentido, porque esa propiedad se define como de solo lectura, por este otro codificador.

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

Por lo tanto, la figura algo acerca de cómo se está sintetizando manualmente su propiedad significa que si se utiliza ese colocador especificado, que le permite establecer una propiedad de sólo lectura de alguna manera.

Si sintetizo manualmente la propiedad, como en el código al que me refiero, todo vuelve a funcionar, pero eso no está haciendo uso de la nueva sintetización automática. Si elimino el readonly, puedo configurar esta propiedad, como era de esperar, pero siento que no entiendo por qué la tiene como de solo lectura, así que apuesto a que estoy rompiendo algo ahí.

Entonces, ¿estoy mal utilizando la nueva sintetización automática? ¿Cómo configuro esto usando el setter, si la sintetización automática no me lo está creando, por solo leerlo?

Gracias

+0

accede directamente al ivar. eliminar uno "_" – Pochi

Respuesta

10

Cuando XCode auto-sintetiza, simula la siguiente ...

@synthesize foo = _foo; 

Por lo tanto, se puede acceder a los datos apropiadamente con self.foo o object.foo.

Sin embargo, en la implementación de los métodos de acceso (e inicializadores y dealloc), debe utilizar el iVar directamente.

Nota, esos iVars tienen dos guiones bajos. Y, están siendo manipulados en el método de acceso. Usa _managedObjectContext, y deberías estar listo para continuar.

+0

Dos guiones bajos? Me parece uno. – oliland

+2

Sí, la pregunta iVars en OP tiene dos guiones bajos (__managedObjectContext) mientras que la auto-sintetización se usa en. –

Cuestiones relacionadas