Pojawienie się | |
---|---|
Paradygmat | |
Typowanie | |
Aktualna wersja stabilna |
2.1 |
Twórca |
Tom Love, Brad Cox |
Platforma sprzętowa | |
Strona internetowa |
Objective-C – rozszerzenie języka C o możliwości obiektowe, wzorowane na Smalltalku. Objective-C przyjął drogę całkowicie odmienną od C++. Jest używany głównie w frameworku Cocoa w systemie OS X oraz w iOS.
Elementy składniowe, o jakie rozszerzono w tym celu język C, używają dwóch symboli: [] oraz @ (rozszerzeń składni jest więcej, ale tylko te wchodzą w jakiekolwiek interakcje ze składnią języka C). Nawiasy kwadratowe są używane do wywoływania metod, natomiast @ do definicji specyficznych dla języka Objective-C. Istnieją też specjalnie dla Objective-C wprowadzone typy, istniejące już według reguł języka C, z których najważniejszym jest id. Typ ten jest uniwersalną „referencją do obiektu” (dokładnie to wskaźnikiem z punktu widzenia języka C). Podobnie jak to jest w Smalltalku, klasa może utworzyć obiekt po wywołaniu na obiekcie klasy metody new:
id object = [[Klasa alloc] init];
Do zaprogramowania czegokolwiek należy stworzyć klasę. Tworzy się ją dwuetapowo: najpierw w pliku .h
definiujemy nagłówki metod oraz pola wewnątrz definicji @interface
, a potem w pliku .m
(pliku z definicjami fizycznymi) – @implementation
, gdzie zawierają się definicje metod.
Wartym wspomnienia elementem jest dodatkowa dyrektywa preprocesora #import
, która odpowiada #include
, lecz nie potrzebuje makrowartowników (plik raz wczytany w danej jednostce kompilacji nie będzie wczytany przy następnych dyrektywach #import
).
W składni Objective-C istnieje mnóstwo podobieństw do Smalltalka, co objawia się m.in. charakterystycznymi dla tego języka „wielosłownymi” nazwami metod (zwanych selektorami), tzn. metoda ma w odpowiednich miejscach dwukropki i na tych pozycjach podczas wywoływania będą przekazywane argumenty, np.:
[object setA: 5 andB: 10];
Istotne różnice w stosunku do Smalltalka są wymuszone przez konieczność używania statycznej typizacji w języku C. Dlatego właśnie w definicjach metod, odmiennie niż w Smalltalku, należy podawać jawnie typ argumentu, jeśli nie jest to id:
-setA: (int)a andB: (int) b;
Znak '-' oznacza, że jest to metoda obiektu. Mógłby być to też '+', wtedy byłaby to metoda klasy (odpowiednik metody statycznej w C++).
Kwestia statycznej typizacji i jednocześnie interakcji z językiem C wprowadza wiele zamieszania. O ile w Smalltalku „wszystko jest obiektem”, o tyle w Objective-C obiektem jest tylko to, co jest dostarczone przez samą nakładkę; elementy takie jak liczby całkowite, czy zmiennoprzecinkowe, są obsługiwane już zgodnie z językiem C. Wprowadza to też zamieszanie w samej definicji języka; przykładowo w kompilatorze GCC można posługiwać się nazwą klasy jako typem statycznym (tzn. można używać np. Klasa*, gdzie Klasa jest klasą zdefiniowaną w Objective-C), natomiast w kompilatorze POC należy się posługiwać wyłącznie wskaźnikiem id dla obiektów Objective-C.
Statyczna typizacja nie wpływa jednak (odmiennie, niż w C++, jak również w Javie, C# i innych zaczerpniętych z C++) na możliwość wywołania metody. Na rzecz obiektu trzymanego przez wskaźnik id można wywołać dowolną metodę, a błąd w tym wywołaniu zostanie wykryty na etapie wykonywania. Tak samo zresztą rzecz ma się w Smalltalku i Incr Tcl.
Model obiektowy w Objective-C jest w ogólności wierną kopią modelu Smalltalka pod każdym względem:
- klasa Object, niejawnie dziedziczona przez wszystkie klasy Objective-C
- dziedziczenie wyłącznie jednokrotne - realizowane w ten sposób, że nierozpoznana wiadomość zostanie przekazana do „superklasy” (klasy bazowej, w terminologii C++)
- koncepcja metaklas, w której klasa jest również obiektem, natomiast tworzenie „obiektu” jest czynnością wykonywaną przez klasę
Nie istnieje standard języka Objective-C — rozwijane są niezależnie dwie nieformalne „koncepcje”: Apple i Stepstone. Implementacja koncepcji Apple jest dostępna jako Apple Objective-C oraz GNU Objective-C (wraz z GCC), natomiast kompilator dla Stepstone Objective-C jest znany jako POC. Koncepcja Stepstone, implementowana przez POC, różni się od Apple m.in.:
- POC posiada pełne odśmiecanie pamięci (gc Boehma lub RC)
- POC posiada lambdę z domknięciami
- POC nie obsługuje statycznej typizacji obiektów Objective-C
Dodatkowo, POC i GCC potrafią implementować nakładkę Objective-C również na język C++, realizując koncepcję Objective-C++ (pliki kompilowane mają wtedy rozszerzenie .mm
zamiast .m
). Kompilator POC, odmiennie niż GNU Objective-C, pracuje podobnie jak Cfront dla C++: na podstawie plików .m
(.mm
) generuje kod w języku C, który następnie podlega kompilacji jako język C (lub C++).
Język Objective-C ostatnio zdobywa popularność w związku z sukcesem urządzeń mobilnych iPhone, iPod touch i iPad. Inne bardziej znane projekty wykonane w tym języku to Cocoa, będący głównym API wysokopoziomowym w Mac OS X oraz GNUStep, mający być implementacją systemu okienkowego OpenStep, stworzonego wcześniej przez NeXT jako NeXTStep. Powiązanie owych faktów jest nieprzypadkowe: Apple swego czasu przejął NeXT wraz z dobrodziejstwem inwentarza, czyli OpenStep i Objective-C.