2012-02-20 6 views
13

Mam trudny czas, aby zrozumieć, jaka jest różnica między dynamicznym wiązaniem dynamicznym typowaniem Vs w Celu C. Czy ktoś może to wyjaśnić?Jaka jest różnica między dynamicznym wiązaniem dynamicznym typowaniem Vs w Objective C

+0

możliwe duplikat [Objective-C wykorzystuje dynamiczne wiązanie, ale w jaki sposób?] (Http://stackoverflow.com/questions/1697093/objective-c-uses-dynamic-binding-but -how) –

+1

@Richard - Nie zgadzam się. PO jest pytany o różnicę między dynamicznym wiązaniem a dynamicznym typowaniem. Pytanie, na które się powołujesz, wcale nie dotyczy pisania dynamicznego. – jlehr

Odpowiedz

27

w Objective-C oznacza, że ​​klasa obiektu typu id jest nieznana podczas kompilacji, a zamiast tego zostaje wykryta w czasie wykonywania, gdy wiadomość jest wysyłana do obiektu. Na przykład w poniższym kodzie klasa foo nie jest znana, dopóki nie spróbujemy wysłać wiadomości componentsSeparatedByString:.

id foo = @"One Two Three"; 
NSArray *a = [foo componentsSeparatedByString:@" "]; 

Jeśli zamiast przy użyciu typu id danych zrobiliśmy następujących ...

NSString *foo = @"One Two Three"; 

... wtedy bylibyśmy użyciu statyczne typowanie zamiast dynamicznego wpisywanie.

Dynamic binding oznacza, że ​​kompilator nie wie, która metoda zostanie wybrana; zamiast tego implementacja metody jest sprawdzana w czasie wykonywania, gdy wiadomość jest wysyłana. Zasadniczo pomaga nam z Polymorphism. Więc

[foo description] 

powoduje wywoływanie innej implementacji metody, jeśli, na przykład, foo jest instancją NSArray zamiast instancji NSString.

6

z dynamicznym pisaniem można mieć zmienną typu id, która może przechowywać dowolny typ obiektu. z dynamicznym powiązaniem możesz to zrobić: id obj; [obj doWhatever]; i tak długo, jak obj jest typu, który implementuje -(void)doWhatever, będzie działać.

2

od Apple Dokumentacji

dynamicznie typowany

Zmienna jest dynamicznie wpisywanych gdy typ obiektu to wskazuje nie jest sprawdzana w czasie kompilacji. Objective-C używa typu danych id do reprezentowania zmiennej, która jest obiektem bez określania, jaki to jest obiekt. Jest to nazywane dynamicznym pisaniem.

Dynamiczne pisanie kontrastuje ze statycznym typowaniem, w którym system jawnie identyfikuje klasę, do której należy obiekt w czasie kompilacji. Sprawdzanie typu statycznego w czasie kompilacji może zapewnić bardziej rygorystyczną integralność danych, ale w zamian za tę integralność dynamiczne pisanie daje programowi o wiele większą elastyczność: elastyczność. Dzięki introspekcji obiektów (na przykład zapytaniu dynamicznie wpisywanego, anonimowego obiektu, jaka jest jego klasa), można jeszcze zweryfikować typ obiektu w czasie wykonywania iw ten sposób sprawdzić jego przydatność dla konkretnej operacji.

Poniższy przykład ilustruje dynamiczne pisanie przy użyciu heterogeniczny zbiór obiektów:

NSArray *anArray = [NSArray arrayWithObjects:@"A string", [NSDecimalNumber zero], [NSDate date], nil]; 
NSInteger index; 
for (index = 0; index < 3; index++) { 
    id anObject = [anArray objectAtIndex:index]; 
    NSLog(@"Object at index %d is %@", index, [anObject description]); 
} 

Obiekt wskazywany przez zmienną w czasie wykonywania musi być w stanie odpowiedzieć na wszelkie wiadomości wysyłanych do niego; w przeciwnym razie twój program zgłasza wyjątek. Rzeczywista implementacja wywoływanej metody jest określana przy użyciu wiązania dynamicznego.

dynamicznego wiązania

wiązania dynamicznego jest określenie sposobu do wywołania w czasie pracy, a nie w czasie kompilacji. Wiązanie dynamiczne jest również określane jako późne wiązanie. W Objective-C wszystkie metody są rozwiązywane dynamicznie w środowisku wykonawczym. Dokładny wykonywany kod jest określany zarówno przez nazwę metody (selektor), jak i przez obiekt odbierający.

Wiązanie dynamiczne umożliwia polimorfizm. Weźmy na przykład zbiór obiektów, w tym psa, sportowca i komputerową symulację. Każdy obiekt ma własną implementację metody run. W poniższym fragmencie kodu, rzeczywisty kod, który powinien zostać wykonany przez wyrażenie [przebieg anObject], jest określany w czasie wykonywania. System uruchomieniowy używa selektora do uruchomienia metody w celu zidentyfikowania odpowiedniej metody w dowolnej klasie anObject.

NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil]; 
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)]; 
[anObject run]; 
0

Jeśli jesteś zaznajomiony z JavaScript, dynamiczne typowanie w celu C jest prawie podobny do tego „var” jest w JavaScripcie, gdzie rzeczywisty typ tej zmiennej będzie zorientowali się w czasie wykonywania i po jej przydzielony. Może być ponownie użyty i powtórzony tyle razy, ile chcesz, co sprawia, że ​​jest to ryzykowne, jeśli nie wiesz, jaki typ obiektu jest zatrzymany w momencie wykonania, tak jak możesz, poprzez wyjątki "nierozpoznanego selektora". . W Objective-C wszystkie obiekty są typu id, a zatem zmienna typu id może być używana do dynamicznego pisania.

Dynamiczne wiązanie obiektów to zachowanie "polimorficzne", w którym wywoływana jest właściwa metoda na podstawie typu obiektu, do którego jest wywoływany w czasie wykonywania.

Mam nadzieję, że pomaga

Powiązane problemy