Mint azt már tudhatjuk, az Objective-C a C nyelv objektum-orientált kiterjesztése. Itt megemlíteném azt is, hogy ennek következtében minden Objective-C fordító le tudja fordítani a tisztán C nyelven írott programokat is. Így gondolom az sem meglepő, hogy az Objective-C (mivel kiterjesztés), örökölte a vezérlési szerkezeteket is. Így ezeket csak nagyon röviden mutatnám be.
Lehetőséget nyújt, hogy bizonyos feltételek teljesülése vagy nem teljesülése esetén más-más kódblokkok hajtódjanak végre. Szintaxisa a következő:
Érdemes megvizsgálni, hogy több feltétel teljesülése esetén mely blokk hajtódik végre. A válasz, hogy a feltételek fentről lefelé kerülnek kiértékelésre. Az első igaz feltételhez tartozó blokk végrehajtódik és a vezérlés az if-else szerkezet végére ugrik. Azaz minden esetben egynél több blokk nem hajtódhat végre - az else ág elhagyható, így ha egyik feltétel sem teljesül, akkor a vezérlési szerkezet végétől folytatódik a program futása. Ha több feltételt vizsgálunk meg és lehetséges, hogy nem minden esetben csak az egyik értékelődhet igaznak, akkor gondosan kell megválasztani a feltételek sorrendjét.
A feltételes kifejezés egy olyan módja a vezérlésnek, mellyel feltételesen állíthatunk át értékeket. A szintaxis:
A logikai kifejezés kiértékelődik, ami ha nem nulla (true), a logikai kifejezés lefuttatja a ? és : közti részt, különben, a : utáni részt.
Ebben a példában két érték maximumát írjuk c-be:
A while ciklus a legalapvetőbb ciklus. Addig fut, amíg a feltétel nem nulla (true).
Például, ha a most következőt kipróbáljuk, a program úgy fog tűnni, mintha megállna a futása, és saját kezűleg kell leállítani. Az olyan esetet, amiben a feltétel sosem lesz hamis, végtelen ciklusnak nevezzük - ilyen esetben a ciklusmag újra és újra lefut.
Itt egy másik while ciklusos példa: A 100-nál kisebb kettő hatványokat írja ki.
Minden ciklus lefolyását irányíthatjuk még break, és continue kifejezésekkel is. A break kifejezés azonnal kilép a ciklusmagból. A continue utasítás pedig kihagyja a blokk további részét, és a blokk kezdeténél folytatja a futást. Példa:
Ebben a példában a számítógép az 'a' értékét írja ki, és azt, hogy nem 64 (hacsak nem lépi át ezt a continue). Hasonlóan a fenti if-hez, a while loop blokkjairól is elhagyható a {}. Példa:
Ez addig növeli az 'a'-t, amíg nem kevesebb, mint 100. Nagyon fontos megemlíteni, hogy amint a while ciklus vezérlő feltétele 0-vá válik (false), a ciklus nem terminál addig, amíg a blokk futása be nem fejeződött, és el nem érkezik annak az ideje, hogy újra kiértékelődjön a feltétel
Ha egy while ciklust szeretnénk termináltatni azonnal, amint egy feltétel bekövetkezik, a break-et használhatjuk. Példa:
Ez a ciklusmagot 5-ször hajtja végre, úgy, hogy az i 4-től 0-ig vesz fel értékeket, csökkenően.
A do..while ciklus utólagos ellenőrzést végző while ciklus. Ez azt jelenti, hogy a feltételt minden egyes futás után értékeli ki. Ennek eredményeképp, még ha a feltétel nulla (false) is volt, akkor is legalább egyszer lefut. Szintaktikája:
Itt felhívnám a figyelmet, a termináló }-ra! . Itt a korrekt szintaktikához szükség van rá. Mivel ez a ciklus is a while egy alakja, így erre is ugyanúgy működik a break és a continue. A continue hatására a feltétel ellenőrzésére ugrik a végrehajtás szála. A break hatására kilép a ciklusból.
Érdemes megjegyezni, hogy a do..while és a while funkciója nagyjából azonos, egy fontos kivétellel: a do..while ciklusok mindig garantáltan végrehajtódnak legalább egyszer, míg a while ciklusok nem, ha a ciklus-feltételük 0 (false) kezdetben.
a for ciklusok általános alakja:
Az inicializáció pontosan egyszer hajtódik végre, pontosan a teszt legelső kiértékelése előtt Tipikusan arra használják, hogy kezdőértéket adjanak egy változónak, habár ez nem feltétlen szükséges. Az inicilizáló kifejezés használható arra is, hogy deklaráljuk, és inicializáljuk a ciklusban használt változókat. A teszt kifejezés minden, a ciklusmagba való lépéskor kiértékelődik. Ha ez a kifejezés 0 (false) az ellenőrzéskor (azaz ha nem true), akkor nem lép bele a ciklusmagba, és a futás a for után folytatódik. Ha a feltétel nem nulla (true), akkor a ciklusmag hajtódik végre. Minden egyes iteráció után az inkrementáló utasítás fut le. Ezt leggyakrabban arra használják, hogy a ciklusváltozó értékét növeljék (a ciklusváltozó az, aminek az értékét a teszt kifejezésben ellenőrizzük, és az inicializáló kifejezésben inicializáljuk). Ha egy continue kifejezést hajtunk végre a ciklusmagban, akkor annak hatására lefut az inkrementáló utasítás. Minden eddig említett rész opcionális a for ciklusban, így elhagyható. Ennek okán sokféle érdekes dolog hajtható végre ennek segítségével. Gyakran használják a for ciklust egy tömb elemein való végiglépkedéshez.
A fenti for ciklus inicializálja a myArray mind a 12 elemét. A ciklusváltozó bármelyik értéknél kezdődhet. Az alábbi példában 1-nél kezdődik:
ennek hatására ez íródik ki: 1 2 3 4 5 6 7 8 9 10 A leggyakrabban a ciklusváltozót 0-ra inicializáljuk (mert a tömbök indexelése 0-nál kezdődik), de néha más értékeket is használunk. Az inkrementáló utasítás más dolgokra is alkalmas, például dekrementálásra. Így gyakori a for ciklus eme formája:
ennek hatására ez íródik ki: 5 4 3 2 1. Itt van egy olyan példa, amiben a teszt kifejezés egy egyszerű változó: Ha a változó értéke nulla, vagy NULL, a ciklus kilép, máskülönben a ciklusmag hajtódik végre.
A while ciklussal is megírhatjuk ugyanezt, de a for ciklus elterjedtebben használt intervallumokon való bejáráshoz, mert minden hozzá szükséges információ egy sorban helyezhető el. Mint már említettem, a for ciklusnak minden utasítása opcionális, így például ilyen is lehetséges, és legális:
Ez is egy végtelen ciklus, mert egészen addig, amíg a ciklusmagban nem érünk el egy lehetséges break kifejezéshez, addig iterálódik Az üres kifejezés mindig true-ként értékelődik ki. Gyakran használatos még a vessző operátor is:
Ez nem a C-ből örökölt, ez csak Objective-C-ben használható. Valójában a for ciklusnak létezik még egy típusú szintaxisa. Ezt a legtöbb programozási nyelvben foreach néven tudjuk elérni, de Objective-C-ben for maradt a neve. Először emlékezzünk vissza a már megismert for ciklusra, amivel előre meghatározott lépésszámú iterációt készíthetünk: //Ez a ciklus egyszerűen ismétel egy utasítást //előre meghatározott lépésszámban:
Most lássuk a foreach típusú for ciklust. A foreach ciklust általában arra használják, hogy végiglépkedjenek vele egy objektumokat tartalmazó listán. Általános szintaxisa: 1.:
vagy 2.:
1. példa:
2. példa:
3. példa:
4. példa:
A hosszú if-else-if-else-if-else-stb... használata nehézkes lehet. Szerencsére van erre egy megoldás: ez a switch-case. Ennek alapvető szintaxisa:
Amennyiben a break utasítást elhagyjuk, úgy a vezérlés nem a switch-case szerkezet utánra kerül, hanem az alatta elhelyezkedő ágra. A default ágban elhagyható lenne ezen utasítás, de konvenció szerint feltüntethető Amennyiben a case utasítás után az adott blokkot egy változó deklarálásával kezdjük, úgy fordítási hibát fogunk kapni. Ezt a hibát feloldani, azzal lehet, ha a case utáni blokkot { } szimbólumok közé helyezzük. Ezt az esetet jól szemlélteti a következő példa:
A következő hibákról fog minket értesíteni a fordító:
Az alábbi módosított kód pedig hiba nélkül fog lefordulni:
A goto egy nagyon egyszerű, és tradicionális irányító mechanizmus. Ez egy olyan kifejezés, amit azonnali, és feltétel nélküli kód-béli ugrásra használhatunk. Ahhoz, hogy a goto-t használni tudjuk, szükségünk van a kódban egy címkére. A címke egy névből, és egy :-ból áll. Ha ez meg van, akkor használható a "goto név;" utasítás a programban. Ennek hatására a futtatás a "név" nevű címke sorától folytatódik. A szintaxisa tehát így néz ki:
Annak képessége, hogy ilyen fajta módon tudjuk a végrehajtást irányítani, nagyon erőteljes eszköz a többi vezérlési szerkezethez képest. (Ez azonban egy kétélű fegyver!) Nézzük az alábbi példát:
Ugyanez a kifejezés érhető el az alábbi módon, két goto-t, és két címkét használva:
Itt az első goto utasítás feltételes. A második feltétel nélküli. Ezt az alábbi módon is elérhetjük:
Amit így is írhatunk:
Amint azt ezek az esetek is bemutatták, a goto kifejezés használata kiváltható más utasítások használatával. A goto-k zabolátlan használata olvashatatlan, és karbantarthatatlan kódot eredményez, miközben ezek kiváltása if-else-ekkel, és for ciklusokkal jobb Kifejezőképességet eredményez. Így a goto kifejezés használata elhagyható, de vannak esetek, amikor pont, hogy elősegíti a könnyebb olvashatóságot, és segítségével elkerülhető a kódduplikálás, illetve a vezérlő változók használata szükségtelenné tehető. Tartsuk szem előtt, hogy a C stílus irányelvei szigorúan tiltják a goto használatát, az alábbi példákat kivéve.
A goto egyik felhasználása a többszörös, mély ciklusokból való ki-break-elés. Mivel a break nem működik (csak egy ciklusból lehet vele kilépni), a goto használható arra, hogy teljesen kilépjünk vele egy mély ciklusból. Goto nélkül is ki tudnánk lépni egy ilyen fajta, mély ciklusból, de ehhez extra változókra, és elágazásokra lenne szükségünk, ami sokkal kevésbé olvasható kódot eredményez, mint goto-val lenne.
A goto használatával könnyen vissza tudunk vonni akciókat, régi vágású stílusban, tipikusan annak elkerülésére, hogy olyan memóriaterületet szabadítsunk fel, ami már le lett allokálva.
Egy másik elfogadott felhasználás az állapot-automata implementációja. Ez egy elég speciális terület, ezért ennek ismertetésére nem térünk ki.