2011-07-06 10 views
5

Uwaga: zazwyczaj w dealloc sposobu należy zwolnić zmiennych obiektu instancji bezpośrednio (zamiast wywoływania określoną dostępowej i przechodzącej nilas parametru), jak pokazano w poniższym przykładzie:Co to jest nowoczesny program wykonawczy?

- (void)dealloc { 
    [property release]; 
    [super dealloc]; 
} 

Jeśli stosując nowoczesny wykonawcze i syntetyzowania zmiennej instancji, jednak nie można uzyskać dostępu do zmiennej instancji bezpośrednio, więc należy wywołać metodę dostępowej:

- (void)dealloc { 
    [self setProperty:nil]; 
    [super dealloc]; 
} 

Czym jest nowoczesny Runtime dokładnie w tworzeniu aplikacji na iOS?

+0

Prawdopodobnie powiązane: http://stackoverflow.com/questions/5621139/is-there-any-problem-using-self-property-nil-in-dealloc –

+0

Nie ma odpowiedzi w tym poście na to, co jest "nowoczesne runtime ". – Pablo

+2

"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. –

Odpowiedz

10

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".

+0

Rzeczywiście. Możesz nawet zmienić nazwę podpórki iVar w '@ synthesize' – Abizern

+1

" Deklarowane właściwości są cechą nowoczesnego środowiska wykonawczego "nie jest prawdą. Zsyntetyzowane znaki iv są cechą nowoczesnego środowiska wykonawczego, ale można używać deklarowanych właściwości zarówno w wersji 32-, jak i 64-bitowej w systemie OS X, co implikuje oba środowiska wykonawcze. –

+0

@BJ Homer: Dzięki za tę notatkę. Przypuszczam, że jest to część zamieszania wokół "nowoczesnego środowiska wykonawczego", właściwości wprowadzanych przez ObjC-2.0 i Leopard, w tym samym czasie co MR. –