ios alkalmazásfejlesztés
mi kell hozzá? Mac OS X ios Developer Program regisztráció (99$/year) SDK + Xcode eszközök 2
Mac OS X Finder Launchpad Spotlight Preview Terminal AppStore 3
Xcode felépítése 4
Xcode felépítése 5
Xcode felépítése 6
Xcode felépítése 7
Xcode felépítése 8
Xcode felépítése 9
Xcode felépítése 10
objective-c
óra felépítése a nyelv kialakulása szintaxis mezők, metódusok elérése objektumok konstruktorok property-k beépített típusok objective-c vs. c# 12
a nyelv kiakalulása az 1980-as évek elején a Stepston(Brad Cox, Tom Love) cég alakította ki a Smalltalk alapján a C nyelv objektum orientált kiterjesztéseként született, de nem azt az irányt követi, mint a C++ ez a kiterjesztés a SmallTalkon alapul.(futásidejű üzenetváltás) 1988-ban a NeXT(Steve Jobs) licencelte a technológiát a NeXTStep rendszere alapjaként, mely később a Mac OS X alapja lett 13
objective-c bevezetés a nyelvben kötelező szétválasztani az interfészt és az implementációt.h - fejlécfájl deklarálja az osztály adattagjait, metódusait, és megnevezi az ősosztályát.m - implementációs fájl definiálja a metódusokat, ezzel tulajdonképpen az osztályt..mm - implementációs fájl C++ contain C++ code in addition to Objective-C and C code 14
szintaxis -.h fejlécfájl előfeldolgozó direktíva #import <Foundation/Foundation.h> //keretrendszerből #import SomeClass.h //projectből @interface AnotherClass : NSObject {.. fordítódirektíva #import <Foundation/Foundation.h> //keretrendszerből @class SomeClass @interface AnotherClass : NSObject {.. 15
szintaxis -.h fejlécfájl @interface ClassName : ItsSuperclass { float width; float height; BOOL filled; UIColor *fillcolor; //... }! + (id)alloc; // osztálymetódus - (void)display; // példánymetódus - (void)setwidth:(float)width andheight: (float)height;! @end 16
szintaxis - metódusok //Deklaráció: - (void)setwidth:(float)width andheight:(float)height; metódus név szétdarabolva argumentumlabel: (típus) argumentumnév zárójelek között a metódus visszatérési értéke. példány metódusok: - jellel kezdődő osztálymetódusok: + jellel kezdődő 17
szintaxis -.m implementációs fájl Az implementáció megírásakor(külön fájlban van), be kell importálni az interfész headerfájlját, és a következőképp definiálhatjuk: #import ClassName.h ; @implementation ClassName + (id)alloc { //... } - (void)display { //... } - (void)setwidth:(float)width height:(float)height { //... }! @end 18
mire jó ez a 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 rövid időn belül hihetetlenül könnyűvé válik a kód olvasása 19
mezők elérése @interface MyFirstClass : NSObject { @public int publicnumber; @protected // Protected is the default char protectedletter; @private bool privatebool; } @end MyFirstClass.h MyFirstClass.m @implementation MyFirstClass - mymethod { publicnumber = 3; protectedletter = 'Q'; privatebool = NO; } @end @implementation OtherClass - (id)mymethod2 { MySecondClass *other = [[MyFirstClass alloc] init]; other->publicnumber = 42; } OtherClass.m @end 20
metódusok elérése A metódus hívások üzenet küldésekként vannak kezelve, csak futási idejű a hozzárendelés, ezért nincs igazi privát metódus! MyClass.m MyClass.h @interface MyClass { // My Instance Variables }! - (void)mypublicmethod;! @end @interface MyClass() - (void)myprivatemethod; @end! @implementation MyClass - (void)mypublicmethod { // Implementation goes here } - (void)myprivatemethod { // Implementation goes here } @end 21
metódus hívása 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 [mysquareobject setwidth:5.0 andheight:5.0]; 22
objektumok létrehozása Myobject *obj = [[MyObject alloc] init]; lefoglal egy sizeof(myobject) méretű memóriaterületet, és visszatér egy inicializálatlan objektummal majd erre meghívjuk az init metódust, ami inicializálja az objektumot, és visszaadja azt 23
objektumok létrehozása alap konstruktor felüldefiniálása - (id)init { self = [super init]; if (self) { // perform initialization of object here } return self; } konstruktor paraméterekkel Konvenció: konstruktorok neve init-tel kezdődik - (id)initwithx:(int)xcord y:(int)ycord { if (self = [super init]) { width = xcord; height = ycord; } return self; } 24
property-k Accessors - (void)settext:(nsstring *)textvalue { if (textvalue!= text) { [textvalue retain]; [text release]; text = textvalue; } } - (NSString *)text { return text; } DE, ezeket legeneráltathatjuk a fordítóval is! 25
property-k A fordító olyan jól tesztelt gyors accessor metódusokat fog generálni melyek algoritmusa készen áll a több szálas környezetben való futásra. Alapértelmezésként a synthesized accessor-ok atomiak abban az értelemben, hogy a getter biztosan valid értéket add vissza még akkor is, ha több aktív szálunk van. #import <Foundation/Foundation.h> @interface SomeObject : NSObject { NSString *text; } @property (nonatomic, strong) NSString *text; @end SomeObject.h SomeObject.m 26 #import SomeObject.h @implementation SomeObject @synthesize text; @end
property-k A property attribútuma a setter muködését határozza meg assign copy strong weak atomic nonatomic readonly readwrite @property (<attributes>) <type> <name>; 27
beépített típusok NSObject - minden Cocoa osztály őse (Java/C# Object) Memória allokáció, és számos runtime szolgáltatás implementációja - (NSString *)description; //Java/C# tostring() NSString NSString* str = @"Hosszú, akár unicode string árvíztűrőtükörfúrógép..."; NSString *str2 = [str stringby...]; //Stringek létrehozása más stringekből NSString *str2 = [str stringbyappendingstring:@"masik string ]; 28
beépített típusok NSNumber szám objektumok NSNumber *five = [NSNumber numbertwithint:5]; NSNumber *thirteen = @(8+5); NSNumber *pi = @3.141593; Konvertálható alap típusokra, pl. intvalue, doublevalue metódusokkal. NSValue számtalan különböző típusra wrapper pl. rectangle, point, pointer, stb. 29
beépített típusok - collections NSObject osztályba tartozó objektumokat tárolnak Mutable+Immutable verzió NSArray NSArray *array = @[@"imac", @"iphone", @"ipad", @ ipad Mini"]; NSMutableArray *mutablearray = [[NSMutableArray alloc] initwitharray:array]; [mutablearray addobject:@"apple TV"];. Elemek lekérdezése: NSString *mini1 = [mutablearray objectatindex:3]; NSString *mini2 = array[3]; 30
beépített típusok - collections NSDictionary Kulcs-érték párok tárolása NSDictionary *prices = @{@"ipad" : @300, @"iphone" : @400, @"imac" : @500, @"Apple TV" : @100}; NSNumber *iphoneprice = prices[@"iphone"]; NSNumber *sameiphoneprice = [prices objectforkey:@ iphone"]; Szintén létezik mutable változata 31
beépített típusok - collections NSSet Nincs rá literál NSSet *set = [[NSSet alloc] initwithobjects:@"imac", @"iphone", @"ipad", @ ipad Mini", nil]; Szintén létezik mutable változata addobject:, removeobject: metódusokkal adhatunk hozzá és vehetünk el elemeket 32
beépített típusok - collections 33
objective-c vs c#
objective-c vs. c# C# int i = 10; bool b = true; (dynamic) anobject; string h = Hello ; objective-c int i = 10; BOOL b = YES; id anobject; NSString* h = @ Hello ; 35
objective-c vs. c# C# obj.dosomething(); objective-c [obj dosomething]; 36
objective-c vs. c# C# String szoveg = new String(); String[] arr = new string[]{ Me, Myself, I }; objective-c NSString *szoveg = [[NSString alloc] init]; NSArray *arr = [[NSArray alloc] initwithobjects: @ Me,@ Myself,@ I,nil]; 37
objective-c vs. c# C# List<string> strings = new List<string>(); strings.add( xyzzy ); // takes only strings strings.add(15); // compiler error string x = strings[0]; strings.remove(0); objective-c NSMutableArray *strings = [[NSArray array] mutablecopy]; [strings addobject:@ xyzzy ]; [strings addobject:[nsnumber numberwithint:15]]; NSString *x = [strings objectatindex:0]; [strings removeobjectatindex:0]; 38
köszönöm a figyelmet! Koltai Róbert robert.koltai@ponte.hu