Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Objective- C Bereczki Gréta Tamara

Hasonló előadás


Az előadások a következő témára: "Objective- C Bereczki Gréta Tamara"— Előadás másolata:

1 Objective- C Bereczki Gréta Tamara
Programozási nyelvek és paradigmák 2. GY / tavasz

2 Objective- C Teljesen objektumorientált, a C nyelv bővített változata, vagyis ami működik C- ben, az Objective- C- ben is Az objektumorientált része a Smalltalk üzenetküldő mechanizmusának egyik változata 1980- as évek elején kezdték el fejleszteni

3 Motiváció- Miért Objective- c?
Harmadik a programozási nyelvek népszerűségét mutató Tiobe listán 2011, 2012 – ben az év programozási nyelve Mac OS X és iOS fő programozási nyelve Növekvő népszerűségnek örvend

4 Motiváció

5 Hello World! #import <stdio.h> //include helyett import int main( int argc, const char *argv[] ) { printf(„Hello World!”) return 0; }

6 Hello World! #import <Foundation/Foundation.h> //include helyett import int main( int argc, const char *argv[] ) NSLog World!"); return 0; }

7 Foundation keretrendszer
Alapvetően osztályok gyűjteménye, amelyek a fejlesztés könnyítését szolgálják. A NeXT Computers cég fejlesztette ki a NeXTStep részeként. Miután az Apple megszerezte a NeXT céget, hamar a Mac OS X és az iOS fejlesztés szerves része lett. A NeXT céget egyébként Steve Jobs hozta létre miután kirúgták az Apple cégtől. A keretrendszer minden osztálya az NS előtaggal kezdődik a NeXTStep-ből adódóan.

8 Azonosítók Kezdőkarakter A-Z, a-z vagy _ , majd további betűk, számok és _ Nem $, % Kis- és nagybetű érzékeny Határoló jel a ; , tetszőleges számú írható belőle egymás után. Megjegyzés: //, /* */ Megengedettek a többsoros sztring literálok.

9 Kulcsszavak A kulcsszavak egy részét a C nyelvből örökölte
Az Objective- C által bevezetett jellel kezdjük, így megkülönböztetve őket a C nyelv kulcsszavaitól Kulcsszavak nem szerepelhetnek azonosítóként

10 Kulcsszavak

11 C nyelvből örökölt típusok
Egész típusok: char unsigned char signed char int unsigned int short unsigned short long unsigned long Valós típusok: float double long double Void típus

12 Típusok A nyelv statikus típusozású
int i, j, k; i=j=k=5; // i, j, k értéke 5 char c, ch; float f, salary; const double d=12; // konstansok a C nyelvhez hasonlóan Van BOOL típus, ennek értéke YES vagy NO lehet id típus: a C- beli void* megfelelője, minden objektum típusa id, futási időben derül ki a konkrét típus

13 Típusok char *str=“This is a C string”
A string típus a C nyelvhez hasonlóan: char *str=“This is a C string” vagy char str[]=“This is a C string.” Objective- C- ben megjelenik az NSString osztály, amely számtalan metódussal segíti a stringek kezelését. NSString is an Objective- C string.” Az NSString immutable típus, azonban létezik mutable változata is, az NSMutableString.

14 Típusok Az NSNumber a C-beli numerikus típusok wrapper osztálya
Szükség van rá például azért, mert az NSArray vagy NSSet tárolókban csak így tárolhatunk numerikus értékeket NSNumber *anInt ; NSNumber *aFloat 26.99F; anInt); //használható %i helyett aFloat);

15 Típusok Az NSInteger az NSNumber- el szemben nem egy osztály, hanem egy primitív típus, ami 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.

16 Típusok Implicit típuskonverzió az alábbi szabályok alapján:
int-> unsigned int->long-> unsigned long-> long long-> unsigned long long-> float-> double-> long double Explicit típuskonverzió lehetséges: double y=4.5; int x=(int)y;

17 Felsorolási típus A felsorolási típust az enum kulcsszó vezeti be
typedef enum { HONDA, NISSAN} CarModel; int main(int argc, const char * argv[]) { CarModel myCar = NISSAN; switch (myCar) case HONDA: case NISSAN: like cars?"); break; default: break; } return 0;

18 Vezérlési szerkezetek
Elágazás, elől- és hátultesztelő ciklus, számláló ciklus (for), switch- case a C nyelv alapján. Használható a goto utasítás is, persze csak nagyon indokolt esetben. Újdonság a for- in ciklus, amely gyűjtemények gyors bejárását teszi lehetővé NSArray for (id model in models) { model); }

19 Típuskonstrukciók Bár használható a C stílusú tömb, mégis leggyakrabban a gyűjtemények a Foundation keretrendszer osztályainak példányai. NSArray *germanMakes for (int i=0; i<[germanMakes count]; i++) { i, germanMakes[i]); }

20 Típuskonstrukciók Az NSArray immutable típus, ezért dinamikusan nem lehet elemeket hozzáadni sem elvenni. Erre a célra használható az NSMutableArray NSMutableArray *brokenCars = [NSMutableArray A6", @"BMW TT", nil]; [brokenCars F25"]; [brokenCars removeLastObject]; Minden gyűjtemény rendelkezik létrehozó függvényekkel. Az NSArray esetében ilyen például az array, arrayWithArray, arrayWithObjects. Az arrayWithObjects például létrehoz és visszaad egy tömböt, ami a megadott objektumokat tartalmazza.

21 Típuskonstrukciók Minden gyűjtemény alapvetően immutable, de létezik mutable változata is (NSMutableArray, NSMutableSet, stb.). A rekord típuskonstrukciónak a C- hez hasonlóan a struct, az úniónak pedig a union felel meg.

22 Pointerek Használhatók a C típusú pointerek, bár legtöbb esetben nincs rájuk szükség int year = 1967; int *pointer = &year; *pointer); pointer = NULL; Ajánlott az Objective- C osztályok használata. Ezeket mindig mutatókon keresztül kezeljük. NSString *anObject; anObject = nil; // a C- ben használt NULL helyett nil- t használunk

23 Pointerek Pointerek összeadása, inkrementálása hasonló eredménnyel jár, mint a C/C++ nyelv esetében. Dereferencia: *<pointernév> A C++ nyelvből ismert referenciák nem használhatóak.

24 Memóriakezelés Memóriát az alloc kulcsszó segítségével foglalhatunk, és a release kulcsszóval szabadíthatunk fel NSString *str=[[NSString alloc] string"]; [str release] A lefoglalt memóriaterületek felszabadítása történhet automatikusan is. Ehhez létre kell hoznunk egy NSAutoreleasePool típusú objektumot. Ha erre az objektumra meghívjuk a drain műveletet, akkor minden lefoglalt memóriaterületre meghívódik a release utasítás.

25 Memóriakezelés #import <Foundation/NSString.h> int main( int argc, const char *argv[] ) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *str1 string"; NSString *str2 = [NSString managed string"]; NSString *str3 = [[NSString alloc] managed string"]; [str3 release]; // memória felszabadítása [pool drain]; // pool felszabadítása } return 0;

26 Memóriakezelés Ha egy objektumra még szükség van, akkor a retain utasítás használata biztosítja, hogy az ne kerüljön felszabadításra. Minden alloc, retain művelet eggyel növeli a referenciaszámlálót az adott objektumra. Annyiszor kell majd meghívni a release műveletet, amennyi a referenciaszámláló értéke. Ennek számontartása azonban nehézkes. Más nyelvekből ismert Garbage Collector funkció nincs.

27 Memóriakezelés - ARC Az Automatic Reference Counting rövidítése, tetszőlegesen be- és kikapcsolható. Előfordítás során hozzáadja a megírt kódhoz a szükséges retain/ release műveleteket, így megkönnyítve a felhasználó dolgát NSObject *obj = [[NSObject alloc] init]; // egyéb műveletek [obj release]; // ARC által automatikusan hozzáadva fordítás során

28 Memóriakezelés- ARC ARC- ban az NSAutoreleasePool osztály helyett blokkot használunk. @autoreleasepool { NSLog World!"); return 0; }

29 Alprogramok Az egyszerű alprogramok ugyanúgy használhatók, mint a C nyelvben float multiply (int, int) { return x * y; } int main (int argc, const char * argv[]) @autoreleasepool float result; result = multiply( 10, 20 ); return 0;

30 Alprogramok Függvények túlterhelése nem lehetséges. Operátorok túlterhelése sem lehetséges. A Java nyelvhez hasonlóan csak érték szerinti paraméterátadás létezik. Pointerek használatával azonban elérhető a referencia szerinti paraméterátadásnak megfelelő hatás.

31 Osztályok Lehetőség van a specifikáció(interfész) és az implementáció szétválasztására külön fordítási egységbe Specifikációt egy .h kiterjesztésű fájl tartalmazza Implementációt(interfészt) egy .m kiterjesztésű fájl tartalmazza Minden objektum közös őse az NSObject

32 Osztályok Az interfész minden esetben kulcsszóval kezdődik és kulcsszóval végződik Az adattagokat a blokkon belül, a metódusokat azon kívül deklaráljuk Az adattagok alapértelmezetten protected elérésűek, @protected

33 Osztályok @interface osztálynév : ősosztálynév { // alapértelmezetten protected elérésű változók } -(típus)példányMetódus1:(típus)par1_neve; +(típus)osztályMetódus1;

34 Osztályok Az előző példa C++ megfelelője
class osztálynév : public ősosztálynév { protected: // változók // public: static void* osztályMetódus1(); static típus osztályMetódus2(típus par_neve); return_type példányMetódus1(típus par1_neve); };

35 Osztályok Az interfészben megadott metódusokat az implementációban definiáljuk. @implementation classname +(típus)osztályMetódus:(típus)par1_neve { // implementáció } -(típus)példányMetódus:(típus)par_neve @end

36 Osztályok Nincs megszokott konstruktor, azonban használható egy inicializáló művelet: - (id) init { self = [super init]; //ősosztály inicializálása if (self != nil) //ősosztály sikeres inicializálása esetén //inicializálás } return self;

37 Osztályok „Destruktor”: csak abban az esetben szükséges, ha nem alkalmazunk automatikus memóriafelszabadítást - (void)dealloc { // lefoglalt objektumok felszabadítása [super dealloc]; }

38 Osztályok Osztály példányosítás:
MyObject *o = [[MyObject alloc] init]; E helyett egyszerűsítésként használható: MyObject *o = [MyObject new]; Ha egy metóduson belül az osztály egy másik metódusát szeretnénk hívni a self változót kell használnunk. A C++ nyelven használt this mutatóval szemben, amely mindig az adott objektumra mutat, ez a program tetszőleges pontján megváltoztatható.

39 Metódusok A metódusok nagyban különböznek az egyszerű függvényektől.

40 Metódusok Metódus példa:
-(void) printFirstName: //függvény neve (NSString *) firstName //első paraméter andLastName: //függvény neve (NSString *) lastName; //második paraméter Itt jön be a Smalltalk üzenetküldés mintája. Ennek szintaktikája: [fogadó üzenet]. Kettőspont után paramétereket adhatunk meg. Az előző metódus hívása: Person *p=[[Person alloc] init] [p

41 Metódusok Szintaktikus cukorkaként a metódusok hívása leírható a más programozási nyelvekből megszokott módon is: Metódusok tulterhelése nem lehetséges, azonban elérhető ahhoz hasonló hatás, hiszen a paraméterek neve is hozzátartozik a függvény nevéhez. -(void)encodeFloat:(float)realv forKey:(NSString *)key -(void)encodeInt:(int)intv forKey:(NSString *)key

42 Osztályok kulcsszóval jelölt adattagokhoz a fordító automatikusan generál getter és setter műveleteket, ha azt az implementációban kulcsszóval jelöljük. A setter művelet az adattag nevéből és a set szóból áll, a getter művelet neve pedig az adattag neve. @implementation Car @synthesize model = _model; ….. Car *toyota = [[Car alloc] init]; // autó léterhozása [toyota Corolla"]; //modell beállítása a [toyota model]); //modell kiiratása a //getter művelet felhasználásával

43 Öröklődés A gyerek osztály mindent örököl a szülő osztálytól.
Többszörös öröklődés nincs, ez azonban megoldható protokollok segítségével. @interface InheritedClass : BaseClass { .... } .... @end

44 Öröklődés Virtuális függvények nincsenek, vagyis igazából csak virtuális függvények vannak. A leszármazottban tetszőlegesen felülírhatjuk az ős műveleteit, példányosításkor a megfelelő változat fog meghívódni. Felülírásnál figyelni kell arra, hogy a felülírt metódusnak pontosan annyi, ugyanolyan nevű argumentuma kell legyen, valamint a visszatérési értéknek is egyeznie kell. A leszármazottban az ősre a super kulcsszóval hivatkozhatunk.

45 Protokollok Ezek a más nyelvekből ismert interfészek megfelelői.
Metódusokat deklarál, amelyeket más osztályoknak kell megvalósítania. Az kulcsszavakkal megjelölhetjük, hogy mik azok a metódusok, amiket kötelező, illetve nem kötelező megvalósítani. Az alapértelmezett beállítás a kötelező.

46 Protokollok @protocoll myProtocoll //protokoll
- (void) requiredMethod; @optional - (void) optionalMethod; (void) anotherOptionalMethod; @required - (void) anotherRequiredMethod; @end //protokoll megvalósítás jelölése @interface ClassName : ItsSuperclass < protocol>

47 Protokollok Egy osztály tetszőleges számú protokollt megvalósíthat:
@interface ClassName : ItsSuperclass < protocol1, protocol2, protocol3….>

48 Köszönöm a figyelmet!


Letölteni ppt "Objective- C Bereczki Gréta Tamara"

Hasonló előadás


Google Hirdetések