Objective-C: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
real class creation
drobne redakcyjne, drobne techniczne
Linia 16:
'''Objective-C''' – rozszerzenie języka [[C (język programowania)|C]] o możliwości obiektowe, wzorowane na [[Smalltalk]]u. '''Objective-C''' przyjął drogę całkowicie odmienną od [[C++]]. Jest używany głównie w [[framework]]u [[Cocoa]] w systemie [[macOS|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ą„referencją do obiektu"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:
 
<syntaxhighlight lang="objective-c">
Linia 22:
</syntaxhighlight>
 
Do zaprogramowania czegokolwiek należy stworzyć [[Klasa (programowanie obiektowe)|klasę]]. Tworzy się ją dwuetapowo: najpierw w pliku <code>.h</code> definiujemy nagłówki metod oraz pola wewnątrz definicji <code>@interface</code>, a potem w pliku <code>.m</code> (pliku z definicjami fizycznymi) - <code>@implementation</code>, gdzie zawierają się definicje metod.
 
Wartym wspomnienia elementem jest dodatkowa dyrektywa preprocesora <code>#import</code>, która odpowiada <code>#include</code>, lecz nie potrzebuje makrowartowników (plik raz wczytany w danej jednostce kompilacji nie będzie wczytany przy następnych dyrektywach <code>#import</code>).
 
W składni '''Objective-C''' istnieje mnóstwo podobieństw do [[Smalltalk]]a, co objawia się m.in. charakterystycznymi dla tego języka "wielosłownymi"„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.:
 
<syntaxhighlight lang="objective-c">
Linia 40:
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„wszystko jest obiektem"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 [[GNU Compiler Collection|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 [[Java|Javie]], [[C Sharp|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 [[Smalltalk]]u i [[Incr Tcl]].
Linia 46:
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"„superklasy” (klasy bazowej, w terminologii C++)
* koncepcja metaklas, w której klasa jest również obiektem, natomiast tworzenie "obiektu"„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 [[GNU Compiler Collection|GCC]]), natomiast kompilator dla Stepstone Objective-C jest znany jako [[POC]]. Koncepcja Stepstone, implementowana przez POC, różni się od Apple m.in.:
Linia 54:
* 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 <code>.mm</code> zamiast <code>.m</code>). Kompilator POC, odmiennie niż GNU Objective-C, pracuje podobnie jak Cfront dla C++: na podstawie plików <code>.m</code> (<code>.mm</code>) 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 [[Application Programming Interface|API]] wysokopoziomowym w Mac OS X oraz [[GNUStep]], mający być implementacją systemu okienkowego [[OpenStep]], stworzonego wcześniej przez [[NeXT]] jako [[NeXTStep (system operacyjny)|NeXTStep]]. Powiązanie owych faktów jest nieprzypadkowe: [[Apple Computer|Apple]] swego czasu przejął [[NeXT]] wraz z dobrodziejstwem inwentarza, czyli [[OpenStep]] i '''Objective-C'''.