2012-08-01 2 views
8

Sono nuovo di Objective-C e XCode, ma sono stato felice di vedere che XCode 4.4 sintetizza automaticamente le mie proprietà per me, ora. Immagino che questo significhi che non devo più scrivere @synthesize per le mie proprietà, e che posso accedervi usando self.propertyName = @"hi";, ad esempio.Come funziona la sintesi automatica di proprietà in xcode 4.4?

Sto cercando di riscrivere un codice di esempio in modo che possa capirlo meglio, ma questo codice implementa un metodo getter personalizzato. Nel codice di esempio, la proprietà viene sintetizzata manualmente come @synthesize managedObjectContext = __managedObjectContext;. Il getter personalizzato assomiglia a questo:

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

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

    return __managedObjectContext; 
} 

nel codice di questa persona, vedo che sta solo usando la sua funzione di accesso sintetizzato manualmente sia per ottenere e impostare. Ho capito nel mio codice, potrei semplicemente sostituire lo __managedObjectContext con self.managedObjectContext, ma no. Se faccio questo, ricevo un errore che mi dice che sto cercando di assegnare a una proprietà readonly. Questo ha senso, perché quella proprietà è definita come readonly, da questo altro codificatore.

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

Quindi, immagino qualcosa su come ha sintetizzare manualmente sua proprietà significa che se usa che setter specificato, gli permette di impostare una proprietà di sola lettura in qualche modo.

Se sintetizzo manualmente la proprietà, come nel codice a cui faccio riferimento, tutto torna al funzionamento, ma non sta facendo uso della nuova sintetizzazione automatica. Se rimuovo lo readonly, posso impostare questa proprietà, come previsto, ma mi sento come se non capissi perché lo ha come readonly, quindi scommetto che sto rompendo qualcosa lì.

Quindi, sto utilizzando male la nuova sintetizzazione automatica? Come faccio a impostare questo usando il setter, se la sintetizzazione automatica non lo sta creando per me, a causa di readonly?

si

+0

accede direttamente a Ivar. rimuovere uno "_" – Pochi

risposta

10

grazie quando XCode auto-sintetizza, simula il seguente ...

@synthesize foo = _foo; 

Quindi, è possibile accedere ai dati in modo appropriato con self.foo o object.foo.

Tuttavia, nell'implementazione dei metodi di accesso (e degli inizializzatori e dealloc), è necessario utilizzare direttamente iVar.

Nota: quegli iV hanno due caratteri di sottolineatura. E, vengono manipolati nel metodo di accesso. Utilizza _managedObjectContext e dovresti essere pronto.

+0

Due caratteri di sottolineatura? Sembra uno per me. – oliland

+2

Sì, gli iV nella domanda OP hanno due trattini bassi (__managedObjectContext) mentre gli usi di sintetizzazione automatica su. –