Istnieje możliwość bezpośredniego dostępu do ivar, pod tą samą nazwą, co własność syntetyzowana. Dyrektywa @synthesize
tworzy ivar w twoim imieniu, jeśli jeszcze nie istnieje, a ponieważ jest to dyrektywa kompilująca, ivar jest dostępny w czasie kompilacji. Zobacz "Runtime Difference" w rozdziale Zadeklarowane właściwości w języku programowania Objective-C. Jak zauważył Abizern w komentarzu, możliwe jest również określenie dowolnej nazwy dla ivar: @synthesize coffee=tea;
- tutaj, tea
jest własnością ivar i coffee
.
Aby użyć ivar, po prostu odwołaj się do niego jak do każdej innej zmiennej, bez używania składni kropkowej. Poniżej wszystko całkowicie legalne i działa zgodnie z oczekiwaniami:
@interface Grisby : NSObject {}
@property (retain) NSObject * obj;
@end
@implementation Grisby
@synthesize obj;
- (void) dealloc {
[obj release], obj = nil;
[super dealloc];
}
- (id) init {
self = [super init];
if(!self) return nil;
obj = [NSObject new];
return self;
}
- (NSObject *) obj {
return [[obj retain] autorelease];
}
@end
„nowoczesnego środowiska wykonawczego” zostało wprowadzone do systemu Mac OS X 10.5 (Leopard) w ramach przejścia na 64-bit. Wszystkie wersje systemu iOS korzystają z nowoczesnego środowiska wykonawczego. Zsyntetyzowane zmienne instancji są cechą nowoczesnego środowiska wykonawczego, co zostało opisane w powyższym łączu.
Inną kluczową różnicą, noted in "Runtime Versions and Platforms" Przewodnika po Programowaniu w Objective-C, jest to, że zmienne instancji są "niestabilne". Istnieje warstwa pośrednia dodawana do pamięci ivar, która pozwala klasom dodawać zmienne bez wpływu na przechowywanie klas pochodnych. Prawdopodobnie ułatwia również syntezę zmiennej instancji. Greg Parker has an explanation z udziałem kociąt, jest tam odniesienie do Mike'a Ash'a: 2009 runtime writeup, a Bavarious tutaj na SO ma swell post o rozszerzeniach pamięci i klasy ivar.
Można zobaczyć inne rzeczy, które uległy zmianie, choć bez wyjaśnienia, w rozdziale dotyczącym wykonywania w środowisku Objective-C "Mac OS X Version 10.5 Delta".
Prawdopodobnie powiązane: http://stackoverflow.com/questions/5621139/is-there-any-problem-using-self-property-nil-in-dealloc –
Nie ma odpowiedzi w tym poście na to, co jest "nowoczesne runtime ". – Pablo
"Nie można uzyskać bezpośredniego dostępu do zmiennej instancji", jak to było w przypadku starszych kompilatorów. Dzięki nowoczesnym kompilatorom można uzyskać dostęp do zmiennej instancji kopii zapasowej, która została automatycznie zsyntetyzowana dla zadeklarowanej właściwości. –