Az Objective-C programozási nyelv

Szabványos könyvtárak



Cocoa

Több szabványos könyvtár is használható az Objective-C nyelvvel. A leggyakrabban használt a Cocoa könyvtár. Ezt a könyvtárat az Apple fejleszti, és általában az Xcode nevű ( szintén az Apple által készített ) fejlesztőkörnyezettel szokás használni, bár elérhető más programozási nyelvekből is (pl.: Clozure CL, LispWorks, Object Pascal, Python, Perl, Ruby, és AppleScript ). A framework összes osztálya az NS előtaggal kezdődik, ami a NeXTSTEP és az OpenStep könyvtárakra utal, aminek a továbbfejlesztéséből a Cocoa született.

Objective-C-ben minden objektum. Az objektumok prototípusa az osztály, amellyel a változóit és egy sor műveletet definiálunk. Emellett az öröklődéssel alakíthatjuk ki az osztályhierarchiánkat, specializálva vagy adaptálva az ősosztályokat. Az Apple Cocoa programozási környezetében ennek a hierarchiának a gyökérosztálya az NSObject amely minden osztályok őse. Hacsak nem egy új gyökérosztályt szeretnénk írni, akkor minden osztálynak származnia kell egy másik osztályból. Az NSObject nem származik semmiből, de az összes NS... osztály - közvetlenül vagy közvetve - belőle származik. Érdemes minden saját osztályunkat leszármaztatni belőle, mert minden objektumpéldánynak kell tudnia Objective-C objektumként viselkednie, és így sokkal egyszerűbb és megbízhatóbb ennek a biztosítása, mintha saját magunk készítenénk erre kódokat.

A Cocoa környezet tartalmazza az NSObject osztályt és több frameworkben több mint 250 különböző osztályt, amelyek közül könnyen kiválaszthatjuk azt, amire szükségünk lehet, és minimális kódolással, kódújrafelhasználással specializálhatjuk a saját osztályainkat. Tulajdonképpen ezek az előre megírt osztályok képezik az Objective-C szabványos könyvtárát. A frameworkökről és a tartalmazott osztályokról a Cocoa honlapján tájékozódhatunk.

Foundation Framework

A Cocoa leggyakrabban használt könyvtára. Azok a dolgok vannak benne, amik nélkülözhetetlenek a mindennapi programozás során ( közülük néhány a teljesség igénye nélkül ):

Gyűjtemények

Megtalálható bennük mindenfajta, a mindennapok során használt gyűjtemény.

Az NSArray, NSSet, NSDictionary „konstans” osztályok: az inicializálásukkor egy felsorolási listával meg kell adnunk az összes elemüket, és ezután nem lehet bővíteni őket. Ugyanakkor minden osztálynak létezik módosítható változata is (NSMutableArray, NSMutableDictionary, NSMutableSet), amiket nem szükséges azonnal inicializálni, és később módosítani is tudjuk azokat.

Ezen kívül jellemző még az összes gyűjtemény típusra, hogy használható rájuk a fast enumeration technika, azaz for ciklussal egyszerűen végig lehet rajtuk iterálni. Például NSArray-ra: for ( Item* item in myArray ) ahol a myArray egy olyan NSArray, amiben Item típusú objektumokat tettünk. Szintén közös, hogy nagyon egyszerűen tudjuk kiírni ezeket a gyűjteményeket fájlba, és betölteni is ugyanolyan egyszerű.

Az Objective- C- ben használt tömb típus az NSArray. Objektumok rendezett gyűjteménye, indexelhető, rendezhető, lehet benne keresni, kiírható fájlba és ezen kívül még nagyon sok műveletet biztosít. Immutable típus, azonban rendelkezik mutable megfelelővel, ez az NSMutableArray. Létrehozhatjuk a más nyelvekből megszokott módon, [] között, azonban elé kell helyeznünk a megszokott @ jelet. A következő példa ezt mutatja be:

NSArray *cars = @[@"Mercedes ", @"BMW", @"Porsche",@"Opel", @"Volkswagen"];
Ezen kívül létrehozhatjuk az arrayWithObjects metódussal is. Elemet elérni a [] operátorral tudunk, vagy az objectAtIndex: metódussal. Bejárásához érdemes a for in ciklust használni.

Tartalmazás ellenőrzésére a containsObject: metódus alkalmas, ez YES értékkel tér vissza, ha a tömb tartalmazza az adott objektumot, egyébként NO értékkel. Az indexOfObject metódus vagy visszaadja az első találat indexét vagy az NSNotFound-t, ha nem találja a keresett elemet. Ha nem csak az első találatot szeretnénk visszakapni, használjuk az indexOfObjext:inRange: metódust. Az NSArray egyik legfőbb előnye a rendezhetőség. A legrugalmasabb rendezési módot a sortedArrayUsingComparator: metódus nyújtja, amely a következő iterátorok valamelyikével tér vissza: NSOrderedAscending, NSOrderedSame, NSOrderedDescending. Az NSArray egy hasznos funkciója a componentsJoinedByString: metódus. Ez konkatenálja a tömb minden elemét egy stringé, elválasztva azokat egy speciális szimbólummal. Ez hasznos lehet reguláris kifejezések létrehozásakor, vagy file elérési útvonalak esetén.

NSMutableArray lehetővé teszi elemek beszúrását és törlését az addObject: és a removeLastObjects: metódusokkal. Az első hozzáad egy elemet a tömb végéhez, a második törli az utolsó elemét. Hozzáadhatunk és törölhetünk is elemet egy előre megadott indexről az insertObject:atIndex: és removeObjectAtIndex: metódusokkal. Amennyiben nem tudjuk az eltávolítandó elem indexét, használhatjuk a removeObject: metódust is, amelynek a konkrét eltávolítandó elemet kell megadnunk.

Az NSSet egy statikus, rendezetlen gyűjtemény, amely egyedi elemeket tartalmaz, a szokásos halmaz műveleteket implementálja. Hatékony annak meghatározásában, hogy egy elem benne van- e a tárolóban. Csakis Objective- C objektumokat tartalmazhat, így a C-s int típust például a már említett NSNumber típussá kell átalakítani ahhoz, hogy a tárolóban elhelyezzük.

Immutable típus. Létrehozhatjuk például a setWithObjects: függvénnyel, amely egy nil-el végződő objektum listát vár. Ezt szemlélteti a következő példa:

NSSet *cars = [NSSet setWithObjects:@"BMW", @"Ford",@"Porsche", nil];
Létrehozhatjuk még a setWithArray művelettel, amely a megadott NSArray-ból hoz létre egy NSSet-t. Mivel az NSSet tároló egyedi elemeket tartalmaz, ez egyszerű módja lehet annak, hogy egy tömbből kiszűrjük a többszörös elemeket. Mivel immutable típus, ezért rendezés után a rendezett tömb tulajdonképpen egy újonnan létrehozott tömb, amely az eredeti tömb elemeire mutat. Az NSSet tároló esetében is igaz ugyanez.

Az NSMutableSet dinamikus törlést és beszúrást tesz lehetővé, így sokkal rugalmasabban használható, mint az NSSet. Törlés és beszúrás esetén hatékonyabb, mint az NSMutableArray. Ugyanúgy hozhatjuk létre, mint az NSSet-t. Beszúrni az addObject:, törölni a removeObject: metódussal lehet. Hozzáadni csak akkor tudunk egy elemet, ha az még nem része a tárolónak. A removeAllObjects: metódus törli a tároló minden elemét. Az NSMutableSet-re alkalmazható néhány tipikus halmazművelet is: unió, metszet, komplementer. Ezeket megfelelően az unionSet:, intersectSet:, minusSet: metódusok teszik lehetővé. Bejárni ugyanúgy lehet, mint az immutable változatot, azonban fontos kikötés, hogy bejárás közben nem változhat a tároló tartalma. Ez minden mutable tároló esetén igaz.

Az NSCountedSet más néven ez a zsák adatszerkezet. Egy elemet többször is tartalmazhat és számon tartja, hogy egy elemből hány van a tárolóban. A fő különbség a mutable halmaz és az NSCountedSet között a countForObject: metódus, amely megadja, hogy egy adott elem hányszor szerepel a tárolóban.

Az NSDictionary egy asszociatív tároló, az NSSet-hez hasonlóan elemek rendezetlen gyűjteménye, azonban minden értékhez tartozik egy kulcs, aminek egyedinek kell lenni. Nincs megkötve, hogy a kulcs típusa ugyanaz legyen, csak hogy ne legyen két ugyanolyan kulcs. Ehhez az NSObject osztály isEqual metódusát használja. Az értékre is egyetlen megkötés van, nem lehet nil. Ha ilyet szeretnénk használni, akkor az NSNull singleton osztály példányát kell használni, ami objektumként reprezentálja a nil értéket.

NSDictionary-t megadhatunk @{} között, vagy létrehozhatjuk a dictionaryWithObjectsAndKeys: és dictionaryWithObjects: metódusok segítségével is. Az értékek eléréséhez használhatjuk a [] operátort vagy az objectForKey: metódust. Az alábbi példa ezt mutatja be:

NSDictionary *cars= @{@"Mercedes":[NSNumber numberWithInt:1], @"BMW" : [NSNumber numberWithInt:2], @"Porsche" : [NSNumber numberWithInt:3],}; NSLog(@"There are %@ BMW’S in stock", cars[@"BMW "]); NSLog(@"There are %@ Mercedes’s in stock", [cars objectForKey:@"Mercedes "]);
A példában létrehozunk egy autókból álló NSDictionary-t, mindegyik típushoz hozzárendelünk egy darabszámot. A darabszámot kétféleképpen is lekérdezhetjük: [] segítségével, valamint az objectsForKey: metódussal is.

Egy adott értékhez tartozó kulcsokat is lekérdezhetjük az allKeysForObject: metódussal. Ez egy NSArray-al tér vissza, hiszen több kulcshoz is tartozhat ugyanaz az érték (természetesen ez visszafelé nem igaz).

Az NSMutableDictionary lehetővé teszi kulcs- érték párok dinamikus hozzáadását a tárolóhoz. Hasonló teljesítménnyel rendelkezik, mint a halmaz tároló beszúrás és törlés esetén. Létrehozhatjuk az NSDictionary-nál megadott módon vagy a dictionaryWithDictionary: metódussal is. A setObject:forKey: metódussal lecserélhetünk egy kulcs értéket vagy újat adhatunk a tárolóhoz.

NSMutableDictionary *jobs = [NSMutableDictionary dictionaryWithDictionary: @{@"Audi " : @"John", @"BMW’ : @"Mary", @"Opel” : @"Bill"}]; [jobs setObject:@"Mary" forKey:@"Audi "];
A fenti példa szemlélteti az NSMutableDictionary létrehozását, valamint az Audi értékhez tartozó John kulcsot lecseréli Mary-re.

Számok

Mivel az összes osztály a Cocoa osztálykönyvtáron belül objektumokat vár paraméterül (pl.: az előbbi collection-ök), ezért ezeknek nem lehet átadni a C-s számtípusokat. Ezért minden egyes szám típusnak van egy Cocoa-s wrapper osztálya, ami egy objektumba burkolja a számot.

Az NSNumber osztály a C numerikus típusainak egy wrapper osztálya, egy általános skaláris értéket képes tárolni, és a megfelelő metódusaival képes azt konvertálni a nekünk megfelelő típusra. Legfőképp primitív típusok tárolására és visszaadására használjuk, és számtalan metódussal rendelkezik mindegyik numerikus típus számára.

NSNumber *anInt = @ 2147483647; NSNumber *aFloat =@ 26.99F;
Az F a szám után a float-ra utal. Azért van szükség ezekre, mert például az NSSet vagy NSArray tárolókban csak így tárolhatunk numerikus értékeket. Ezen kívül egyszerű konvertálási lehetőséget biztosít a primitív adattípusok között, valamint egyszerűen megkaphatjuk az érték NSString reprezentációját.
NSNumber *anInt = [NSNumber numberWithInt:42]; float asFloat = [anInt floatValue]; NSString *asString = [anInt stringValue];
A fenti példában az anInt változót létrehozzuk egy egész értékkel. Az asFloat változó az anInt értékének float reprezentációját kapja értékül, míg az asString változó a string reprezentációját.

Immutable típus, vagyis új NSNumber objektum jön létre minden értékadásnál. Bár két NSNumber mutató egyenlőségvizsgálatát végezhetjük direkt módon, az isEqualToNumber: metódus használata sokkal biztonságosabb, hiszen ez biztosítja, hogy két objektumot megfelelően hasonlít össze még akkor is, ha különböző objektumban tároljuk őket.

NSNumber *anInt = @27; NSNumber *sameInt = @27; if (anInt == sameInt) { NSLog(@"They are the same object"); } if ([anInt isEqualToNumber:sameInt]) { NSLog(@"They are the same value"); }
A fenti példában az első egyenlőség vizsgálat (==) nem tér vissza igaz értékkel, hiszen olyan pointerek egyenlőségét vizsgáljuk, amelyek nem egyenlők. A második egyenlőség vizsgálat (isEqualToNumber) igazzal tér vissza, hiszen a két értéket vizsgálja, amelyek egyenlők.

Összehasonlításra használható még a compare: metódus is, amely egy NSComparisonResult objektummal tér vissza logikai érték helyett. Ennek értéke lehet NSOrderedAscending, ha kisebb kapcsolat áll fent a két operandus között, NSOrderedSame, ha egyenlőség, NSOrderedDescending, ha nagyobb kapcsolat áll fent a két operandus között.

Az NSInteger az NSNumber-el szemben nem egy osztály, hanem egy primitív típus, amely megfeleltethető az int típusnak. Általában az NSInteger- t ciklusokban, számításoknál, stb. használjuk, más esetben érdemes az NSNumber- t használni.

Az NSValue objektum egy egyszerű tároló, amely egyetlen C-s vagy Objective-C-s értéket tárol. Tartalmazhat skaláris típusokat (mint az int, float, char), pointereket vagy struktúrákat is. Célja, hogy a felsorolt típusokat is hozzá lehessen adni például az NSArray vagy NSSet tárolókhoz, hiszen ezek csak objektumokat tartalmazhatnak. Mindig immutable.

Az NSDecimalNumber lebegőpontos számok használatát teszi lehetővé. 10-es alapú számítások elvégzését biztosítja előre ismert kerekítési szabályok mellett. Ezért jobb választás például a double- nál, adott esetben. NSDecimalNumber-t létrehozhatunk előjel, kitevő és mantissza megadásával vagy string-ből.

NSDecimalNumber *price; price = [NSDecimalNumber decimalNumberWithMantissa:1599 exponent:-2 isNegative:NO]; price = [NSDecimalNumber decimalNumberWithString:@"15.99"];
A fenti példában a két megadási mód ekvivalens értéket reprezentál, csak a megadás módja különbözik.

Az osztály számos aritmetikai műveletet biztosít, amelyek a C-s natív aritmetikai műveletek megfelelői: decimalNumberByAdding, decimalNumberBySubstracting, decimalNumberByMultiplyingBy, decimalNumberByDividingBy, decimalNumberByRaisingToPower.

NSDecimalNumber *priceSquared = [price decimalNumberByRaisingToPower:2];
A fenti példában a négyzetre emeljük a korábban definiált price változót. Az NSDecimalNumber típusú objektumok összehasonlítására a compare: metódust használjuk a megszokott egyenlőségvizsgálat operátorok helyett.

Stringek

Az NSString egy immutable típus, vagyis létrehozás után nem változtatható. Unicode karakterek sorozatát reprezentálja, ezért nem kell foglalkoznunk az ékezetes karakterek tárolásának különlegességével. A mutable alosztálya az NSMutableString. Stringet létrehozni legegyszerűbben @”...” módon hozhatjuk létre. A kódba írt @”...” string literálok NSConstantString típusúra konvertálódnak, ami az NSString típusnak altípusa. Létrehozáshoz használhatjuk még a stringWithFormat: létrehozó metódust is. Ez abban az esetben hasznos, ha a szöveg változó értékeket is tartalmaz, például:

NSString *firstName = @"John"; NSString *lastName = @"Smith"; int age = 35; NSString *message = [NSString stringWithFormat:@"His name is %@ %@ and he is %d years old!", firstName, lastName, age];
Az osztály minden jelentős sztringkezelő metódust tartalmaz (keresés, csere, összehasonlítás, konkatenáció, részstringképzés, kis/nagybetűsítés stb.), lehetőséget biztosít C-s karaktertömbök NSString-gé konvertálására. Hasonlóan a collection osztályokhoz, az NSString is konstans. Az NSString osztály két primitív metódusa a length (megadja az Unicode karakterek számát) és a characterAtIndex (megadja a kért indexen levő elemet), az indexelés 0- tól kezdődik. Stringek egyenlőségvizsgálatára a megszokott == operátor helyett használjuk az isEqualToString metódust. Szó eleji vagy szóvégi egyezést a hasPrefix és a hasSuffix függvényekkel vizsgálhatunk. A compare metódust használhatjuk két string összehasonlítására.

Az NSMutableString az NSString mutable változata. Lehetőséget biztosít a karakterek megváltoztatására anélkül, hogy egy új objektumot hozna létre. Az NSMutableString örököl az NSString-től, így ugyanúgy használhatjuk mint az NSSting-t. Ha új értéket akarunk adni egy mutable string-nek, használjuk a setString: metódust.

Annyira fontos osztály ez, hogy az NSObject osztályban van egy metódus, a description, ami az adott objektum tartalmát adja vissza stringként ( feltéve persze hogy a származtatott osztályokban felüldefiniáljuk ezt a metódust ).

Egyéb osztályok

Minden programozási nyelvben összetett feladat a dátumok kezelése. Objective- C- ben számos lehetőség van erre. Az NSdate egy adott időpillanatot reprezentál, amely nem függ időzónától. A date metódus visszaad egy objektumot, ami az aktuális dátumot és időt tartalmazza. Ezen kívül alkalmas dátumok, időpontok összehasonlítására az isEqualToDate: és compare: metódusokkal. Az NSDateComponents egyszerű osztály, amely a különböző naptárak periódusait képes kezelni. Ha például egy NSDate objektum year tulajdonságát 2014-re állítjuk, akkor azt feldolgozhatjuk a Gergely naptár szerint (2014), a Buddhista naptár szerint (1471), vagy más naptárak szerint.

Az NSNull egyetlen osztálymetódust definiál, a null-t, amely visszaadja a singleton NSNull objektumot. Különbözik a NULL- tól és nil-től abban, hogy egy objektum nem pedig egy nulla érték. Az Objective- C- ben használt tárolókban nem használhatunk nil értéket, helyette használjuk az NSNull-t. Ezt szemlélteti a következő példa.

NSNull *nullValue = [NSNull null]; NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue];

Az NSReguralExpression alkalmas reguláris kifejezések létrehozására és alkalmazására Unicode stringeken. A minta szintaxisát az ICU szabvány adja meg. Reguláris kifejezést a regularExpressionWithPattern: metódussal hozhatunk létre, itt meg kell adnunk a mintát, amire illeszteni szeretnénk. Az NSRegularExpressionCaseSensitive-el beállíthatjuk, hogy a mintára illesztés kis- és nagybetű érzékeny legyen.

Fájlműveletek

A Foundation framework biztosítja az alapvető fájlműveleteket is. Az NSFileManager osztály segítségével lehet fájl és könyvtár műveleteket végrehajtani ( fájl létezésének vizsgálata, létrehozás, átnevezés, mozgatás, másolás, törlés ). Lehetőséget ad egy NSData objektum egy utasítással való kiírására illetve visszaolvasására. ( Az NSData objektum tulajdonképpen egy bájttömb, NSDatává lehet alakítani pl. a stringeket és a collectionoket, vagy pl. hálózatról érkezett adatokat is NSData-két kapjuk meg ). Így roppant egyszerűvé válik ezek tárolása.

Az NSFileManager egy singleton osztály, a példányt az [NSFileManager defaultManager] hívással kérhetjük le.

A többi szokásos fájlműveletet NSFileHandle-n keresztül érhetjük el. Először is kérünk egy NSFileHandle példányt az NSFileHandle osztály statikus metódusain keresztül ( fileHandleForReadingAtPath, ugyanez ForWriting írásra és ForUpdating írásra és olvasásra ), majd ezen keresztül tudunk pozícionálni a fájlban, valamint írni és olvasni.

Memóriakezelés

Mint az az eggyel lentibb pontban olvasható, az Objective-C 2.0-ás verziója már rendelkezik szemétgyűjtővel, ami leveszi az objektumok felszabadításának terhét a programozó válláról. Mivel ez még az iPhone platformon nincs implementálva, ezért nem térhetünk ki az objektumok létrehozásának és felszabadításánk problémája elől.

Az Objective-C referencia számlálást használ. Minden egyes objektumnak van egy referenciaszámlálója, ami az objektum létrehozásakor 1-re állítódik (retainCount hívással le is kérdezhető). A számlálót retain hívással lehet növelni, és release hívással lehet csökkenteni. Ha a referenciaszámláló eléri a 0-t, meghívódik az objektum dealloc metódusa és az objektum felszabadul. Ha például egy objektumot beteszünk egy tömbbe, akkor az növelni fogja a referenciaszámlálóját. Másik példaként, az Objective-C 2.0-ban vannak az automatikus property-k, ahol megadhatjuk az egyes set propertyknek tulajdonságul, hogy másolják a paraméterül kapott objektumot, vagy pedig csak a referenciaszámlálóját növeljék. Fontos átgondolni ezeket a dolgokat, mert könnyen felszabadítatlan memóriát hagyhatunk a programunkban.

Egy segítség a nyelv és framework készítőitől az NSAutoreleasePool. Ha inicializálunk a kódunkban egy ilyen objektumot, és az újonnan létrehozott objektumunkon létrehozás után rögtön végrehajtunk autorelease-t hívást, akkor az objektum bekerül a pool-ba ( a referenciaszámlálója nem változik meg ). Nekünk ezután nem kell release-t hívnunk, hanem amikor a pool-t kiürítjük egy drain hívással, az majd csökkenti eggyel a számlálóját ( persze ha közben meghívunkjuk az objektum retain metódusát, akkor csökkentenünk is kell ). Ez arra jó, hogy nem kell pontosan tudnunk, hol kell felszabadítanunk az objektumot, elég azt tudnunk, hogy a drain üzenetnél az összes pool-ba regisztrált objektum referenciaszámlálója csökken eggyel. Ez magyarázza azt is, hogy ha egy objektumot kapunk vissza valamilyen függvénytől, akkor arra nem kell release-t hívnunk, mivel a visszatérés előtt egy autorelease-zel be lett regisztrálva egy autorelease pool-ba, és nekünk is hasonlóképpen kell eljárnunk az általunk visszaadott objektumokkal. Ezért nagyon fontos, hogy a kódunkban az elsők között szerepeljen egy NSAutoreleasePool inicializálása.

Application Framework

Az Application framework a Cocoa másik leggyakrabban használt könyvtára. Segítségével grafikus felhasználói felülettel rendelkező programokat írhatunk. Érdemes használnunk az XCode fejlesztőkörnyezet InterfaceBuilder nevű segédprogramját, ami nagyban leegyszerűsíti a felületek építését és összekötését az érdemi munkát végző kóddal.

WebKit Framework

A WebKit nyílt forráskódú böngészőmotor. Az Apple az eredetileg a KDE-hez fejlesztett KHTML és KJS könyvtárakból forkolta és építette a Safari böngészőbe. A Google Chrome, valamint a Kindle, az Android, a BlackBerry Tablet OS és a webOS böngészője is a WebKit-re épül. A WebKit Framework a böngészőmotorra épített Objective-C API. Segítségével könnyedén építhetünk tetszőleges OSX vagy iOS alkalmazásba böngészőfunkciókat, jeleníthetünk meg webes tartalmakat.

A WebKit használatával meg egy ablakban webes tartalmakat tudunk megjeleníteni úgy, hogy az Interface Builderrel az ablakba húzzuk a WebView vezérlőt és egy URL betöltését kérjük tőle az erre szolgáló üzenettel. A vezérlő a várakozásnak megfelelően fog működni, létrehozza a megjelenítéshez szükséges nézeteket, futtatja a JavaScript kódokat, letölti a hivatkozott erőforrásokat, követi a hivatkozásokat.

A WebKit nem implementálja a modern böngészők összes funkcióját, de az API támogatja ezek implementációját. A SimpleBrowser példaprogram bemutat ezek közül néhányat.

A WebKit lehetővé teszi a tartalom szerkesztését és a DOM manipulálását is, valamint elérhetővé teszi a documentumban futó JavaScript-et is.

A WebKit osztályai

A továbbiakban bemutatjuk a WebKit fő osztályait és azok szolgáltatásait.

A WebKit felépítése többé-kevésbé megfelel az MVC paradigmának. Néhány osztály a View-Controller réteget, mások a Modell réteget reprezentálják.

WebView

A WebView a keretrendszer központi osztálya. Ahhoz, hogy egy alkalmazásban webes tartalmat jelenítsünk meg, ezt kell elhelyzni egy ablakban és a mainFrame propertyjének küldött üzenet segítségével meg kell kérni, hogy töltsön be egy URL-t.

    WebFrame *mainFrame = [webview mainFrame]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://nyelvek.inf.elte.hu/leirasok/Objective_C/"]]; 
    [mainFrame loadRequest: request];
    

A WebView-ban WebFrame objektumok kezelik a tartalmat. A WebFrame-ek hierarchiája megfelel a HTML tartalom frame-hierarchiájának. A gyökér a WebView mainFrame propertyje. Minden WebFrame-hez egy WebFrameView objektum tartozik, ami megjeleníti a frame tartalmát.

A webes tartalom testreszabásához WebView megbízottakat (delegate) kell implementálni, amik a folyamat különböző aspektusait kezelik. Az összes WebView megbízott informális protokoll (az NSObject-et kiterjesztő category), így csak azokat metódosaikat kell implementálnunk, amikre szükségünk van.

WebFrameLoadDelegate
A keretek életciklusának figyelésére: betöltés kezdete, befejezése, keret zárása, scroll értesítés, oldalcím, ikon letöltődése, hiba a keret letöltése közben, átirányítás.
WebResourceLoadDelegate
A tartalomhoz tartozó erőforrások életciklusának figyelésére: letöltődés egyes szakaszai, autentikáció.
WebUIDelegate
Felhasználói felület eseményei: dialógusok életciklusa, átméretezés, fókuszváltás, egér-események, javascript panelek, státuszüzenetek, drag-and-drop.
WebPolicyDelegate
Az alapértelmezett kezelést módosíthatjuk vele.

A WebKit kiterjeszthető saját dokumentumnézet és reprezentációs osztályokkal különböző MIME típusokra a registerViewClass:representationClass:forMIMEType: metódus hívásával.

WebFrameView

A WebFrameView példányai jelenítik meg a HTML kereteket. A példányokat nem kell létrehozni, aa WebView hozza létre és kezeli őket.

WebFrame

A WebFrame példányai zárják egységbe a WebFrameView-ban megjelenített adatokat. Minden kerethez tartozik egy WebFrame, ami a WebView-ban megjelenik. A teljes oldal WebFrame-ek hierarchiájaként reprezentálódik, a gyökér a WebView mainFrame-je.

Minden WebFrame-hez tartozik egy WebDataSource objektum, ami a keret tartalmának betöltését kezeli. A loadReques: metódus hívásával indítható aszinkron tartalomletöltés, ami egy ideiglenes adatforrást fog létrehozni. Az ideiglenes adatforrás végleges adatforrássá alakul, amint bármilyen adat érkezik a kérésre.

WebDataSource

A WebDataSource egy keretben megjelenítendő tartalmat zár egységbe. A MIME típusnak megfelelő formátumú adatot a representation adattag tárolja. Új típusokat kezelőp osztályokat a WebView registerViewClass:representationClass:forMIMEType: osztályszintű metódusával regisztrálhatunk.

A WebDataSource-hoz tartozik még egy eredeti kérés (initialRequest), egy végleges kérés (request) és egy válasz (response). Az isLoading metódussal az adat használata előtt le kell kérdezni, hogy folyik-e még a töltés. A data metódussal kérdezhető le a bináris adat, a representation metódussal a reprezentációja.

WebResource

A WebResource egy letöltött URL-t reprezentál. Egységbe zárja a letöltött adatot, az URL-t, a MIME típust és a keret nevét.

WebArchive

A WebArchive egy archiválható weboldalt reprezentál. Az archiválás jelenthet mentést háttértárra vagy beillesztést a vágólapra. Tartalmazza a fő erőforrást és a teljes erőforrásfát.

WebHistoryItem

A WebHistoryItem egy oldalmegtekintés adatait zárja egységbe annak érdekében, hogy a felhasználók később visszetérhessenek a megtekintett oldalra. A WebHistory és a WebBackForwardList osztályok WebHistoryItem-példányok listáját kezelik. Az oldalak betöltésekor automatikusan létrejönnek, így nem kell őket létrehozni.

WebBackForwardList

A WebBackForwardList osztály a meglátogatott oldalak listáját kezeli annak érdekében, hogy a felhasználó előre-hátra lépkedhessen rajta. Csak a lista kezelését végzi, az oldal betöltéséhez a WebFrame loadRequest: metódusát kell használni.

Az oldalak jellemzően a megtekintésük sorrendjében kerülnek a listába. Az objektum elérhetővé teszi az aktuális elemet, az előzőt (-1) és a következőt (+1). A goBack és a goForward metódusok segítségével léptethető előre és hátra. Az elemek száma korlátozható a setCapacity metódus segítségével. A goToItem: a megadott elemre ugrik. A cache-ben tárolt oldalak száma szabályozható a pageCacheSize metódus segítségével.

A többi metódus nem módosítja az objektum állapotát, csak visszaadja a kért elemet vagy elemeket.

WebHistory

A WebHistory a meglátogatott oldalakat tárolja a WebBackForwardList-hez hasonlóan WebHistoryItem példányokban. Az oldalak listája bővíthető az addItems: és a removeItems: metódusokkal.

A megbízottak

A megbízottak informális protokollok. Ez azt jelenti hogy nem protocol-ként, hanem az NSObject-et bővítő category-ként vannak deklarálva. Így nem kötelező a teljes implementációjuk, elegendő azokat a metódusokat megírni, amelyekre szükségünk van.

WebFrameLoadDelegate

A WebView keretbetöltés megbízottak értesítést kapnak a keretek betöltésének folyamatáról: ha a töltés megkezdődik, ha az oldal címe vagy ikonja betöltődött, egy átirányítás történik, egy adatforrás véglegesítődik bagy egy módosítás befejeződik. A webView:didStartProvisionalLoadForFrame:metódus hívódik a betöltés megkezdésekor,a webView:didFinishLoadForFrame: a befejeződésekor. A többi metódus akár többször is hívódhat egy betöltés alatt.

WebResourceLoadDelegate

A WebView erőforrásletöltés megbízottak az egyes erőforrások betöltésének folyamatáról kapnak értesítéseket. Egy oldalon akár több száz erőforrás jelenhet meg, az oldalletöltés folyamatát a WebFrameLoadDelegate segítségével érdemes figyelni.

Minden erőforráshoz külön kérés és válasz objektum keletkezik. A webView:identifierForInitialRequest:fromDataSource:metódus használatával lekérdezhetünk egy figyelő objektumot, amivel az egyes erőforrásokat a későbbiekben azonosíthatjuk.

WebUIDelegate

A WebView felhasználói felület megbízottak új ablakok nyitását vezérelhetik, bővíthetik az alapértelmezett menüelemek viselkedését és más UI-val kapcsolatos feladatokat végezhetnek. Meghívódhatnak JavaScript és más plugin-események bekövetkeztekor.

WebPolicyDelegate

A WebPolicyDelegate a WebPolicyDecisionListener protokollal együttműködve módosíthatja a WebView alapértelmezett működését.

Quartz Framework

Kétdimenziós vektorgrafikus rajzolást lehetővé tevő objektum- és függvénygyűjtemény.

UIKit Framework

Ez már a Cocoa Touch része, hasonló az Application framework-höz, a különség köztük, hogy ezt az új iPhone és hasonló hardverek grafikus felhasználói felületének programozására használják, tartalmazza az Application framework egyes grafikus elemeinek érintésérzékeny képernyőre optimalizált változatait, ezen kívül pedig számos olyan vezérlőt, amik csak itt érhetőek el.