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
//keretrendszerből #import “SomeClass.h” //projectből @interface AnotherClass : NSObject { ..
fordítódirektíva #import //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; } @end
20
OtherClass.m
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 @interface SomeObject : NSObject { NSString *text; } @property (nonatomic, strong) NSString *text; @end
SomeObject.m
26
SomeObject.h
#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 () ; 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 [email protected]