Objective-C PPKE-ITK 2013. 02. 14.
Objective-C bevezetés "Objective-C is a superset of C" Header:.h, osztálydeklarációk Implementáció:.m, osztályok implementációja Objective-C++:.mm Framework: Cocoa
Szintaxis @interface Student { int age; NSArray* lectures; NSString* name; } - (id)initwithname:(nsstring*)name andage: (int)age; + (Student*)studentWithName:(NSString*) name; @end
Szintaxis Objective-C kulcsszavak @-al kezdődnek @interface Student Osztálynév { C++ 'class' megfelelője int age; NSArray* lectures; NSString* name; } - (id)initwithname:(nsstring*)name andage: (int)age; + (Student*)studentWithName:(NSString*) name; @end
Szintaxis Objective-C kulcsszavak @-al kezdődnek @interface Student { int age; NSArray* lectures; NSString* name; C++ 'class' megfelelője Osztálynév Member változók kapcsos zárójelek között. Objective-C típusok prefixe: NS (NextStep) } - (id)initwithname:(nsstring*)name andage: (int)age; + (Student*)studentWithName:(NSString*) name; @end
Metódusok szintaxisa //Deklaráció: - (id)initwithname:(nsstring*)name andage:(int)age; Metódus név szétdarabolva!!! Argumetumok: (típus) argumentumnév Zárójelek között a metódus visszatérési értéke. Az id típus egy Objective-C objektumra mutató pointer. (Egy erősebb void*...) A - jelenti a példány metódust, a + jellel kezdődő metódusok osztálymetódusok.
Metódusok szintaxisa - C++ vs. Objective-C //Objective-C - (id)initwithname:(nsstring*)name andage:(int)age; //C++ id InitWithNameAndAge(NSString* name, int age);
Mire jó ez a furcsa szintaxis? Miért jó, hogy szét vannak darabolva a metódusnevek? minden argumentum előtt szerepel olvashatóan leírva a funkciója öndokumentáló a kód névadási konvenciók segítik a kód megértését, olvasását pár hét után hihetetlenül könnyűvé válik a kód olvasása
Metódus hívás, message passing Metódushívás NÉVSZERINT történik Bármikor bármilyen objektumra meghívhatunk egy metódust, a neve alapján Ha az adott objektumnak nincs ilyen metódusa, kivételt dob Futásidőben lekérdezhető, hogy adott objektum implementál-e adott metódust Szintaxis: [image drawatpoint:position withattributes: attributes]; Metódus név szétdarabolva!!! Objektum, amin meghívjuk a metódust Argumetumok
Kitekintés C++ dinamikus kötés Virtuális metódustáblán keresztül keresi meg az adott metódust Objective-C dinamikus kötés A névszerinti metódushívás maga a dinamikus kötés egyben
Futásidejű típusinformációk Selectorok Egy metódus nevét tárolja SEL method = selector(drawatpoint:withattributes:); Mire használjuk? if ([obj respondstoselector:method]) { //... } Egyéb típusinformációk (továbbiakért lsd. doksi) Class c = [NSString class]; if ([obj iskindofclass:c]) { //... }
Objektumok létrehozása Memóriakezelésről később lesz szó Konvenció: konstruktorok neve init-tel kezdődik Student *student = [[Student alloc] initwithname:@" Sheldon"]; A Student osztály lefoglal egy siezof (Student) méretű memóriaterületet, és vissza tér egy inicializálatlan objektummal Majd erre meghívjuk az initwithname: metódust, ami inicializálja az objektumot, és visszaadja azt
Beépített típusok NSObject ~ Java Object osztálya Memória allokáció, és számos runtime szolgáltatás implementációja Minden Cocoa osztály ősosztálya - (NSString *)description; //Java tostring() NSString NSString *str = @"Hosszú, akár unicode string, árvíztűrőtükörfúrógép..."; //Stringek létrehozása más stringekből, gyakran így történik: NSString *str2 = [str stringby...] //Például: NSString *str2 = [str stringbyappendingstring :@"Masik sztring..." ];
Beépített típusok Number Value Szám objektumok Analógia: Java Integer és Double NSNumber *five = @5; NSNumber *thirteen = @(8+5); NSNumber *pi = @3.141593; Konvertálható alap típusokra, pl. intvalue, doublevalue metódusokkal. Továbbiakért lásd a doksit. Számtalan különböző típusra wrapper Pl. rectangle, point, pointer, stb.
Beépített típusok Szokásos containerek Array NSObject osztályba tartozó objektumokat tárolnak Mutable+Immutable verzió NSArray *array = @[@"imac", @"iphone", @"ipad", @" ipad Mini"]; NSMutableArray *mutablearray = [[NSMutableArray alloc] initwitharray:array]; //Módosítható [mutablearray addobject:@"apple TV"]; //Elemek lekérdezése. Mindkét hívás ugyanazt adja. NSString *mini1 = [mutablearray objectatindex:3]; NSString *mini2 = array[3];
Beépített típusok Dictionary Kulcs-érték párok tárolása (Analógia: C++ std::map) NSDictionary *prices = @{@"ipad" : @300, @"iphone" : @400, @"imac" : @500, @"Apple TV" : @100}; //Indexelhető NSNumber *iphoneprice = prices[@"iphone"]; NSNumber *sameiphoneprice = [prices objectforkey:@" iphone"]; Szintén létezik változtatható verziója NSMutableDictionary *mutableprices = [[NSMutableDictionary alloc] init]; mutableprices[@"iphone"] = @1000; mutableprices[@"shitty IBM PC"] = @-1000;
Beépített típusok Set Nincs rá literál NSSet *himym = [[NSSet alloc] initwithobjects:@" Ted", @"Robin", @"Barney", @"Marshall", @"Lily", nil]; Változtatható verziója NSMutableSet addobject:, removeobject: metódusokkal adhatunk hozzá és vehetünk el elemeket
NSLog Konzolra logol NSObjecteket, illetve alap típusokat tud kiírni Úgy működik mint a printf NSObjecteknek a description által visszaadott stringet írja ki NSNumber *five = @5.0; NSString *string = @"String"; int basicsix = 6; double basicpi = 3.141592; NSArray *array = @[@"a", @"b", @"c"]; NSLog(@"This is five:%@ This is a string:%@ Six:%d PI=%f Three new lines:\n\n\n The contents of the array:%@",five, string, basicsix, basicpi, array);
Foreach Tárolókat foreach loop segítségével iterálhatjuk NSSet *himym = [[NSSet alloc] initwithobjects:@"ted", @"Robin", @"Barney", @"Marshall", @"Lily", nil]; for (id obj in himym) { NSLog(@"%@", obj); } Kimenete: 2013-02-03 16:13:54.211 tmp[36512:303] Ted 2013-02-03 16:13:54.213 tmp[36512:303] Barney 2013-02-03 16:13:54.214 tmp[36512:303] Marshall 2013-02-03 16:13:54.215 tmp[36512:303] Lily 2013-02-03 16:13:54.216 tmp[36512:303] Robin
Foreach NSArray, NSDictionary, NSSet illetve ezeknek a Mutable verziói járhatók be foreach looppal NS(Mutable)Dictionary esetében a KULCSOK sorozatát iterálja végig
Osztályok //Student.h @interface Student : NSObject { NSString* name; NSDate* dateofbirth; } - (id)initwithname:(nsstring *)name; //Setter getter a name memberhez - (void)setname:(nsstring *)name; - (NSString*)name; @end
Osztályok Konstruktorok implementációja: - (id)initwithname:(nsstring *)studentname { self = [super init]; //Ősosztály inicializálása if (!self) //Ha nem sikerult inicializálni return nil; } [self setname:studentname]; //Egyéb inicializációk return self; //Végül saját magunkkal visszatérünk
Propertyk Getterek és setterek automatikus generálása Különböző attribútumok: readonly, readwrite, strong, weak, atomic, nonatomic @interface Student : NSObject { } - (id)initwithname:(nsstring *)studentname; @property (nonatomic, strong) NSString *name; @end
Propertyk Propertyk dot syntax-szal érhetők el Student* student = [[Student alloc] initwithname:@"sheldon Cooper"]; //Értékadás student.name = @"Mr. Cooper"; //Lekérdezés NSString* somename = student.name; Propertyk által generált setterek/getterek kézzel felülírhatók, részletesen következő előadáson