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
Odpowiedz
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
.
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ć.
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];
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
- 1. Jaka jest różnica między dynamicznym linkerem i dynamicznym programem ładującym?
- 2. Jaka jest różnica między dynamicznym proxy JDK a CGLib?
- 3. Jaka jest różnica między delegatami C#, dynamicznym proxy, zamknięciami i wskaźnikami funkcji?
- 4. Jaka jest różnica między instancjamiRespondToSelector i respondsToSelector w Objective-C?
- 5. Jaka jest różnica między isEqualToString a operatorem == w Objective C?
- 6. Jaka jest różnica między _zmienną i własną.zmienną w Objective-C?
- 7. Co to jest odpowiednik C# w dynamicznym C++ w C++?
- 8. Jaka jest różnica między standardowym komponentem MBean a dynamicznym komponentem MBean?
- 9. Objective-C: Jaka jest różnica między forKey i forKeyPath?
- 10. ! vs == nil w Objective-C
- 11. Jaka jest różnica między Xcode, Objective-C i Cocoa?
- 12. Interfejs w dynamicznym języku?
- 13. Zmienna w ciągu dynamicznym w C#
- 14. Jaka jest różnica między NSURLSessionDataTask vs NSURLSessionDownloadTask
- 15. Jaka jest różnica między url vs urlRoot
- 16. Problem z programowaniem dynamicznym
- 17. Jaka jest różnica między sjlj vs karzeł vs seh?
- 18. Problemy z programowaniem dynamicznym
- 19. Używanie Paxos w środowisku dynamicznym
- 20. Jaka jest różnica między C# i .NET?
- 21. funkcja połączeń w dynamicznym LINQ
- 22. Różnica między _ i self. w Objective-C
- 23. FindViewById gdzie ID jest ciągiem dynamicznym
- 24. Jaka jest różnica między reindexall() vs reindexeverything() w Magento?
- 25. Jak dodać wartość null 0r w "dynamicznym NSArray" w Objective C
- 26. Znajdowanie elementów z dynamicznym Id
- 27. akcji Facebook z dynamicznym tekstem
- 28. Widok kręgosłupa z dynamicznym id
- 29. ChannelFactory bug z dynamicznym argumentów
- 30. wyjmowanie pól z dynamicznym ModelForm
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) –
@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