Az iOS fejlesztés tanulása közben az egyik dolog, amivel megismerkedik az ember, az az Objective-C. Részemről a webes, scriptes fejlesztések irányából közelítettem a nyelvhez, s amellett, hogy egy teljesen másik világ, pár ismerős dologgal is lehet találkozni. Két bejegyzést is írok a témáról, de inkább csak a – számomra – érdekesebb, és a “szokásostól eltérő” nyelvi lehetőségeket próbáltom meg összeszedni, és nem egy átfogó képet adni a nyelvről.

Az Objective-C-ről a Wikipédiában is lehet olvasni egy korrekt áttekintést, és a bejegyzés írása közben is találtam egy rövid, tömör összefoglalást: Learn Objective-C, ezeket is érdemes átolvasni, sokkal több infót átadnak, mint én a következőkben.
Rövid történet
Az Objective-C 1983-ban jelent meg a NeXT által fejlesztett NeXTSTEP operációs rendszerben (december 20-án volt 15 éve, hogy bejelentette az Apple a NeXT felvásárlását) – Steve Jobs aktívan részt vett a fejlesztésében. A nyelv ugyanúgy a C kiterjesztése, mint a C++, de az előtt jelent meg, és – értelemszerűen – sok ponton különböznek egymástól. Jelentős részén, például az üzeneteken (lásd lejjebb) a Smalltalk jelentős befolyása figyelhető meg, de “szerencsére” inkább a C-s vonal maradt az erősebb. Az iOS eszközökön az Apple által 2006-ban bejelentett Objective-C 2.0 változattal dolgozhatunk, bár például a garbage collection-t pont nem támogatja (még?) az iOS.
Szintakszis
Az Objective-C szintakszisa első ránézésre eléggé szokatlan. Másodikra is. Harmadikra viszont már teljesen okés, és az XCode kódkiegészítése is sokat tud segíteni. Mivel C-s nyelvi elemekből építkezik, a PHP-val vagy JavaScripttel összehasonlítva a szinktakszist nagyon sok a hasonlóság, leginkább a metódusok hívása különbözik. Egyből két dolog is van, egyrészt szögletes zárójelek között, nem ponttal, hanem szóközzel elválasztva hívunk meg egy metódust, másrészt sokkal bőbeszédűbb a nyelv a megszokottakhoz képest. Konkrétan:
[UIView alloc]
Itt az UIView objektum alloc metódusát hívtuk meg. Más nyelveken ez UIView.alloc() szintakszisú lenne. A paraméterek átadásánál lesz bőbeszédű, ámde nagyon könnyen olvasható a nyelv:
[UIColor colorWithRed:0.16 green:0.33 blue:0.33 alpha:1.0]
Ahogy látható, nem csak a paramétereket soroltuk fel, hanem a paraméterek neveit is, utánuk kettősponttal írva az értékeket. Más nyelveken ez UIColor.colorWithRedGreenBlueAlpha(0.16, 0.33, 0.33, 1.0) lenne, vagy méginkább UIColor.colorRGBA(0.16, 0.33, 0.33, 1.0). Fontos megérteni, hogy a paraméterek nevei szerves részét képezik a metódus nevének, a sorrendjük nem felcserélhető. A gépelésben a kódkiegészítés segít, a kezdőknek végképp.
Szerintem a legnagyobb sokkot ez a szintakszis tudja okozni a nyelvvel ismerkedőknek, miután megszokjuk, utána viszont már teljesen érthető, átlátható.
Bár ezzel a szintakszissal érhetjük el az objektumtulajdonságokat is, az Objective-C 2.0 bevezette a más nyelveknél megszokott ponttal jelölést is, tehát amennyiben az “x” egy property-je az obj-nak, akkor a következő két sor teljesen ekvivalens, mind a kettőt használhatjuk:
[obj x] obj.x
Üzenetek, protokollok
Az Objective-C a metódushívást alapvetően nem metódushívásnak, hanem üzenetküldésnek hívja. Az objektumoknak üzenetet küldünk (fentebb az “alloc” üzenetet küldtük), amivel az kezd valamit. Az egyik opció az, hogy van egy ilyen nevű metódusa, és azzal fogja lekezelni. Ez a megfogalmazás azonban nem öncélú, az is előfordulhat, hogy az objektum az üzenetet továbbküldi, akár egyszerre több objektumnak is. Ha így gondolkozunk, akkor az gyorsan segít megérteni a protokollokat is.
A protokollok olyan nyelvi elemek, melyek üzeneteket (metódusokat) sorolnak fel, de nem valósítják meg azokat. Nagyon hasonlítanak az osztályok interfészeihez, de csak metódusokból állhatnak. Egy osztály deklarációjakor jelezhetjük, hogy az megvalósít egy konkrét protokollt, vagyis a protokoll által definiált üzenetekre válaszolni tud. Ekkor az osztályunknak ezeket a metódusokat meg kell valósítania (az egyes üzeneteknél a protokoll jelezheti, hogy opcionálisan megvalósítandó egy üzenet lekezelése). A protokollok standardizálják azt, hogy az egyes objektumok hogyan kommunikálhatnak, s milyen üzeneteket küldhetnek egymásnak – s ez a filozófia aztán az egész objektumhierarchiát áthatja, amivel dolgozunk.
Kategóriák
A protokollokhoz hasonlóan érdekes nyelvi lehetőséget kínálnak a kategóriák, melyek segítségével “kész” (pl. amit az operációs rendszer kínál számunkra) osztályokat tudunk kiegészíteni újabb metódusokkal, illetve akár már létező metódusokat is felüldefinálhatunk (ezzel azért óvatosan). Ez nagyon-nagyon hasonlít a JavaScript prototípusainak kiterjeszthetőségéhez, annyira, hogy akár futási időben is kiterjeszthető egy osztály (ez is egyébként a Smalltalk-ból érkezett az Objective-C-be). A kategóriák célja, hogy a kód amit írunk logikusan szervezhető legyen, s ne kelljen alosztályokat létrehoznunk egy kiterjesztéshez.
Folyt. köv.
Rövidesen jön a következő bejegyzés a témáról, melyben pár további egyedi nyelvi megoldásról fogok szót ejteni még.
