2012-08-01 14 views
8

Jestem nowy w Objective-C i XCode, ale byłem zadowolony, że XCode 4.4 automatycznie syntetyzuje moje właściwości dla mnie. Rozumiem, że oznacza to, że nie muszę już wypisać @synthesize dla moich właściwości, i że mam do nich dostęp na przykład za pomocą self.propertyName = @"hi";.Jak działa automatyczna właściwość syntezatora w kodzie Xcode 4.4?

Próbuję ponownie napisać przykładowy kod, dzięki czemu mogę go lepiej zrozumieć, ale ten kod implementuje niestandardową metodę pobierającą. W przykładowym kodzie własność jest syntezowana ręcznie, jako @synthesize managedObjectContext = __managedObjectContext;. Zwyczaj getter wygląda następująco:

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

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

    return __managedObjectContext; 
} 

W kodzie tej osoby, widzę, on po prostu używając swojego ręcznie zsyntetyzowany akcesor zarówno get i set. Pomyślałem w moim kodzie, mogłem po prostu zastąpić __managedObjectContext z self.managedObjectContext, ale nie. Jeśli to zrobię, otrzymuję komunikat o błędzie informujący, że próbuję przypisać do właściwości readonly. Ma to sens, ponieważ ta własność jest zdefiniowana jako readonly przez tego innego kodera.

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

Więc dowiedzieć czegoś o tym, jak on ręcznie syntetyzowania swoją własność oznacza, że ​​jeśli używa on określony setter, pozwala mu ustawić właściwość readonly jakoś.

Jeśli ręcznie dokonam syntezy właściwości, tak jak w kodzie, do którego się odwołuję, wszystko wraca do działania, ale to nie korzysta z nowej automatycznej syntezy. Jeśli usuniemy readonly, mogę ustawić tę właściwość, zgodnie z oczekiwaniami, ale mam wrażenie, że nie rozumiem, dlaczego on ma ją jako przeczytaną, więc założę się, że coś tam łamie.

Czy używam nowej automatycznej syntezatora? Jak ustawić to za pomocą settera, jeśli automatyczna synteza nie tworzy go dla mnie, z powodu tylko do odczytu?

Dziękuję

+0

on uzyskuje dostęp bezpośrednio do ivar. usuń jeden "_" – Pochi

Odpowiedz

10

Kiedy XCode auto-syntetyzuje, to symuluje następujących ...

@synthesize foo = _foo; 

Tak, można uzyskać dostęp do danych odpowiednio z self.foo lub object.foo.

Jednak w implementacji metod akcesorów (oraz inicjalizatorów i dealloc) należy bezpośrednio korzystać z iVar.

Uwaga: te iVary mają dwa podkreślenia. I są manipulowani w metodzie accessor. Użyj wartości _managedObjectContext i powinieneś być dobry.

+0

Dwa podkreślenia? Wygląda jak dla mnie. – oliland

+2

Tak, iVars w pytaniu OP ma dwa podkreślenia (__managedObjectContext), podczas gdy auto-synthesize używa. –

Powiązane problemy