Wprowadzenie do Objective C

Język Objective C powstał w oparciu o rozwiązana stosowane w języku smalltalk i jest rozszerzeniem języka „klasycznego C”. Sam w sobie jest językiem w pełni obiektowym ( nawet najprostszy typ jest obiektem ), ale nie ogranicza się tylko do jednego paradygmatu programowaniu z uwagi na to iż jest rozszerzeniem języka C – można także korzystać z typów i instrukcji języka C. Podobna sytuacja była z C++ ( rozszerzenie języka C o paradygmat programowania obiektowego ). Tak więc jeżyk Objective C = ANSI C + Obiektowość w stylu SmallTalka 😉

Na wikipedii http://pl.wikipedia.org/wiki/Objective-C wpis dotyczący Objective C naświetla metodykę programowania w tym języku. Jest tam kilka nieścisłości dotyczące wywoływania metod.
O ile w C++ metody ( funkcje składowe ) wywoływane są na rzecz obiektu to w Objective C mówimy o wysyłaniu wiadomości do konkretnego obiektu !
Tak więc dla przykładu – tworzymy fikcyjny obiekt i wysyłamy do niego wiadomość z argumentem:

ObjectType *object = [[ObjectType alloc] init];
[object foo: argument]

Jeśli znasz jakiś inny język typu OOP ( object-oriented programming ) to nauka ObjC będzie będzie znacznie przyjemniejsza 🙂
To samo w C++ wyglądałoby tak:

ObjectType object;
object.foo(argument);
// lub przez wskaźniki
ObjectType *ptrToObject = new ObjectType();
ptrToObject->foo(argument) 

Aby nie mieć problemów ze zrozumieniem dalszej części tekstu, należy zaznajomić się z takimi zagadnieniami jak: obiekt, klasa – funkcje składowe klasy ( metody ), pola ( właściowości/zmienne ) klasy, dziedziczenie, wskaźniki.

W 1 linijce tworzymy obiekt a w zasadzie wskaźnik do utworzonego obiektu ( wskaźnik czyli zmienna, która zawiera adres komórki pamięci w którym przechowywany jest nasz obiekt a będąc bardziej ścisły miejsce od którego „zaczyna” się nasz obiekt, gdyż zapewne zajmuje więcej niż jedną komórkę pamięci ). W ObjC do obiektów kierujemy się właśnie przez owe wskaźniki. Czyli pokazujemy wskaźnikiem na konkretny obiekt 🙂
Pamiętaj, że gwiazdka „*” jest obowiązkowa przed nazwą zmiennej obiektowej podczas inicjalizacji. Później używamy zmiennej bez gwiazdki, kompilator przecież już wie, że jest to wskaźnik, tak mu „powiedzieliśmy” podczas inicjalizacji zmiennej obiektowej.

W 2 linijce mamy już wysłanie wiadomości do obiektu, obiekt po otrzymaniu owej wiadomości ( jako adresat ) wywołuje swoją funkcję foo(argument). Programista C++ powiedziałby: obiekt wywołał funkcję składową foo(argument).
Adresat to oczywiście obiekt 🙂

Jak widać składnia opisująca obiekty jest dość egzotyczna, ale to ma też swoje plusy 🙂 Objective C jest językiem, który łatwiej analizować, gdyż jest bardziej opisowy, np:
wysłanie wiadomości ( wywołanie funkcji przez adresata )

NSString *textObject = @"jakis teksik";
[textObject substringFromIndex:6];

Jak widać wiadomość przesyłana do obiektu jest w pełni opisowa. Można to wytłumaczyć w ten sposób, że jeśli funkcja ma jakiś argument to jej nazwa powinna być dwuczłonowa „nazwa funkcji” + „opis argumentu”. W naszym przykładzie nazwa funkcji substringFromIndex: tak właśnie jest zbudowana.

Dla drugiego i kolejnych argumentów jest podobnie ( choć tutaj to tylko opisy argumentów ), dla uproszczenia w ojczystym języku np:

Rysowanie *rysownik = [Rysowanie alloc] init];
[rysownik rysujProstokatOSzerokosci: 5 iDlugosci: 10]

Jak widać, kod jest opisowy i o to chodzi 🙂 Jest prostszy w analizie zarówno przez autora jak i innych programistów.
Tak więc dla przypomnienia i utrwalenia wiadomości, powyższy kod, tworzy obiekt „rysownik” na podstawie klasy „Rysowanie”.
Wiadomość „alloc” wywoływana jest na rzecz klasy Rysowanie ( UWAGA: w Objective C klasa także jest obiektem !!! ). Wiadomość alloc przydziela potrzebną pamięć dla nowo tworzonego obiektu i zwraca instancję obiektu ( adres do utworzonego obiektu ). Wiadomość init służy do inicjowania obiektu ( a ściślej do zainicjowania wszystkich pól nowo utworzonego obiektu ).
Reasumując wiadomość alloc jest wysyłana do klasy a wiadomość init do obiektu który został zwrócony przez instrukcje [Rysowanie alloc]. Jest to dokładnie to samo co:

Rysowanie *rysownik = [Rysowanie alloc];
rysownik = [rysownik init];

Wspomnieć należy także o konwencji nazewniczej, dla przykładu – jak widać powyżej, to:

– nazwy klas mają pierwszą dużą literę
– nazwy obiektów piszemy z małej litery
– nazwę wiadomości piszemy z małej a każde nowe słowo zaczynamy z dużej litery

Często klasy mogą tworzyć obiekty na kilka sposobów, np:

NSString *string1 = @"jakis tekst";
NSString *string2 = [[NSString alloc] initWithString:@"kolejny tekst"];
NSString *string3 = [NSString stringWithFormat:@"jakis tekst + obiekt string2: %@", string2];

W pierwszym przypadku obiekt *string tworzony jest za pośrednictwem znaku specjalnego @, jest to dedykowany znak dla typów NSString, tak aby szybko utworzyć sobie obiekt z danym tekstem, jest to na pewno krótsze niż to co widać w linii nr 2. A efekt końcowy jest praktycznie taki sam 🙂
W linii nr 3 jak widzimy, to już klasa NSString tworzy nam obiekt na podstawie swojej „metody”. Dzięki tej metodzie możemy formatować tekst, tutaj dołączyłem obiekt string2 do nowo utworzonego obiektu string3.

Celowo nie będę we wprowadzeniu opisywał tworzenia własnych klas, gdyż na początku i tak będziemy korzystać z frameworka Foundation, który jest podstawowym zestawem klas i możemy je traktowac jako klasy wbudowane dla Objective C. Zestaw owych klas umożliwia nam na podstawowe operacje na stringach, plikach, sieci, itp.

To co opisałem tutaj to kompletne podstawy, o wielu aspektach dotyczących ObjC nie wspomniałem, gdyż na tym etapie może tylko wprowadzić zamieszanie.

Dodaj komentarz