Az iphone fejlesztés alapjai. I. előadás

Hasonló dokumentumok
Az iphone fejlesztés alapjai

ios alkalmazásfejlesztés

ios alkalmazásfejlesztés alapjai Nagy Aszter András BME MIK

ios alkalmazásfejlesztés Koltai Róbert

OOP #14 (referencia-elv)

Objective-C PPKE-ITK

Mi az a Memory Management

iphone programozás alapjai

OOP: Java 8.Gy: Abstract osztályok, interfészek

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

iphone és Android két jó barát...

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Tartalomjegyzék. I. rész: Bevezetés. A szerzőről... xvii. Köszönetnyilvánítás... xix. Bevezetés... xxi. 1. Bevezetés az iphone programozásába...

Osztályok. 4. gyakorlat

iphone programozás alapjai I. Gyakorlat

JAVA PROGRAMOZÁS 2.ELŐADÁS

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

MOBIL PLATFORMHÁBORÚ. Török Gábor

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java programozási nyelv 5. rész Osztályok III.

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Platform lehetőségek kutatása: ios. A Mobil multimédiás kliens fejlesztői eszközkészlet létrehozása című kutatás-fejlesztési projekthez

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Objektumelvű programozás

Programozási nyelvek Java

ISA szimulátor objektum-orientált modell (C++)

Java programozási nyelv 4. rész Osztályok II.

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Mobil készülékek programozása

Bevezetés a programozásba előadás: Öröklődés

iphone programozás alapjai

C++ programozási nyelv Konstruktorok-destruktorok

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Internetkonfigurációs követelmények. A számítógép konfigurálása. Beállítások Windows XP alatt

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

C#, OOP. Osztályok tervezése C#-ban

iphone Programozás II. előadás február 14.

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Pénzügyi algoritmusok

Objektum orientált kiterjesztés A+ programozási nyelvhez

3. Osztályok II. Programozás II

RIA Rich Internet Application

OOP és UML Áttekintés

Stateless Session Bean

Programozási nyelvek Java

ios alkalmazásfejlesztés Koltai Róbert

Bevezetés, platformok. Léczfalvy Ádám

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Mobil Informatikai Rendszerek

Programozási nyelvek JAVA EA+GY 1. gyakolat

Google C++ style guide

Android Wear programozás. Nyitrai István

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

C++ programozási nyelv

Mobil Üzleti Intelligencia

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Programozási nyelvek Java

ELTE SAP Excellence Center Oktatóanyag 1

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Magas szintű programozási nyelvek 2 Előadás jegyzet

Már megismert fogalmak áttekintése

Bevezetés a Python programozási nyelvbe

OOP: Java 4.Gy: Java osztályok

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

Java és web programozás

Pénzügyi algoritmusok

Java és web programozás

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Java és web programozás

Programozás II. 6.Öröklés Dr. Iványi Péter

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

A Java EE 5 plattform

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java programozási nyelv 6. rész Java a gyakorlatban

Memóriakezelés, dinamikus memóriakezelés

Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás

NYOMÓGOMBOS KÉSZÜLÉKEK

Mobil Informatikai Rendszerek

Ft Ft Ft Ft Ft Ft Ft

Mobilplatformok Merre tart a világ? Kis Gergely MattaKis Consulting

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

NYOMÓGOMBOS KÉSZÜLÉKEK

Mobil Telefonon Keresztüli Felügyelet Felhasználói Kézikönyv

Bevezető. Servlet alapgondolatok

Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

JAVA webes alkalmazások

Objektumorientált programozás C# nyelven

Programozás C++ -ban

Objektumorientált programozás C# nyelven

Átírás:

Az iphone fejlesztés alapjai I. előadás

A ponte.hu Kft. 2001 óta a piacon Web iphone, Android, Nokia és Windows mobile fejlesztések Újszerű megoldások és technológiák keresése

A kurzus menete 3x45+2x45 perc Elméleti háttér és programozási alapok Elméleti órák Teszt 1x45 perc Az elméleti anyagból, a verseny a laborhelyekért megy Gyakorlat 4x3x45 perc, és egy kiegészítő bemutató előadás Közösen fogunk programozni, több témakört átívelve

A kurzus felépítése Elmélet Gyakorlat Nyelvi elemek Eszközök Szemlélet API

A mai előadás témái I. Áttekintés Az iphone története Az iphone fejlesztés eszközei és menete II. Az Objective-C nyelv alapjai Objektum orientáltság III. Memória kezelés IV. Nézzünk meg egy példát

I. Áttekintés

Az iphone története 2007. Első iphone kiadása Nagyon korlátozott: 2G, nincs alkalmazás telepítés, nincs GPS, nincs multitask, de forradalmian új felhasználói felület. 2008. iphone 3G Nagyon sok fájó pontot javít, megjelenik az AppStore 2009. iphone 3GS Ráncfelvarrás, nagyobb processzor teljesítmény, digitális iránytű (Augmented Reality), később multitask 2010. ipad, mad iphone 4 Nagy felbontású kijelző, giroszkóp

Miért forradalmi? Nincs külső telepítés Ellenőrzés AppStore Korlátozott funkciók Korlátolt multitask Szeparált fájlrendszer Minimális testreszabás Minimális fragmentáció Megfelelő teljesítmény Felhasználói élmény Multitouch Egyetlen gomb Animált felületek Kötött készülékek Egyszerű kezelés

Az iphone számokban Több mint 120 millió eladott ios készülék Több mint 250 000 alkalmazás Több mint 10 000 000 000 letöltés Tulajdonosok 50%-a már vásárolt alkalmazást

Miért az Apple a minta? Mobile készülékek 2010 I. félév Profit megoszlás 2010 I. félév Others 29% Nokia, Samsung, LG 66% Nokia, Samsung, LG 32% Apple 3% Forrás: Fortune Others 31% Apple 39%

Az ios platform Támogatott eszközök: iphone 2G, 3G, 3GS, 4 ipod touch 1.-4. generáció ipad Minimális fragmentáció iphone SDK a fejlesztői környezet (csak Mac) Natív alkalmazások Objective-C nyelven

A fejlesztés eszközei Xcode IDE A központ Debugger és Profiler alkalmazások Interface Builder Felületek építése Nem kötelező, de hasznos iphone Simulator Nem emulátor Jó teljesítmény Nem teljes

A fejlesztés menete Koncepció Fejlesztés Tesztelés Specifikáció Kódolás Szimulátor Arculat Felület építés Készülék

II. Objective-C

A nyelv kialakulása 1980-as évek elején a Stepstone cég alakította ki a Smalltalk alapján 1988-ban a NeXT licencelte a technológiát a NeXTstep rendszere alapjaként, amely később a Mac OS X alapja lett A C nyelv objektum orientált kiegészítéseként született, de nem azt az irányt követi, mint a C++ (Simula) C++: obj->method(argument); Objective-C: [obj method: argument];

Osztályok Classname.h @interface classname : superclassname { // instance variables +classmethod1; +(return_type)classmethod2; +(return_type)classmethod3:(param1_type)param1_varname; -(return_type)instancemethod1:(param1_type)param1_varname :(param2_type) param2_varname; -(return_type)instancemethod2withparameter:(param1_type)param1_varname andotherparameter:(param2_type)param2_varname; @end Classname.m @implementation classname +classmethod { // implementation -instancemethod { // implementation @end

Mezők elérése @interface MyFirstClass : NSObject { @public int publicnumber; @protected // Protected is the default char protectedletter; @private bool privatebool; @end @implementation MyFirstClass - mymethod { publicnumber = 3; protectedletter = 'Q'; privatebool = NO; @end @implementation OtherClass - (id)mymethod2 { MySecondClass *other; other = [[MyFirstClass alloc] init]; other- >publicnumber = 42; @end

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 @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

Konstruktorok Az objektumokat mindig mutatókkal érjük el MyObject *o = [[MyObject alloc] init]; Alap konstruktor felül definiálása -(id) init { if ( self = [super init] ) { // perform initialization of object here return self; Konstruktor paraméterekkel -(id) initwithx: (int)xcord y:(int)ycord { if ( self = [super init] ) { width=xcord; height=ycord; return self;

Öröklődés Egyszeres öröklődés @interface Car : Vehicle { @end Többszörös öröklődés helyett protokollok @protocol Motoros -(int)geturtartalom; @end Protokoll megvalósítás @interface Car : Vehicle <Motoros>{ @end

III. Memóriakezelés

Nincs Garbage Collection GC Nem kell foglalkozni a memória felszabadítással De gyakorlatilag nem is lehet Kevesebb hibalehetőség, de kevésbé hatékony Kézi kezelés Hibalehetőségek: Memory leak és Bad Access Kiszámítható teljesítmény, de munkás Statikus és dinamikus elemző eszközök

Retain...Release -(void)dosomething{! SomeObj* someobject=[[someobj alloc] init];!.!.! do something with the object!.!.! [someobject release]; alloc refaincount=1 retain refaincount++ dosomething release refaincount-- No -(void)usesomething:(nsstring*)someobject{! [someobject retain];! myobject=someobject; retaincount==0? -(void)dontneedanymore{! [myobject release];! myobject=nil; Yes dealloc

Property Hogy néz ki egy egyszerű setter? -(void) settext:(nsstring *)textvalue { if (textvalue!= text) { [textvalue retain]; [text release]; text = textvalue; Mindezeket megcsináltathatjuk a fordítóval is! SomeObject.h #import <Foundation/Foundation.h> @interface SomeObject : NSObject {! NSString* text; @property (nonatomic,retain) NSString* text; @end SomeObject.m #import "SomeObject.h" @implementation SomeObject @synthesize text; @end

Property Hogyan használjuk más osztályokban?! SomeObject* someobject=[[someobject alloc] init];! someobject.text=@"hello";! NSString* localtext=someobject.text; További lehetőségek @property (nonatomic,retain) NSString* text; nincs nonatomic: alaptípus (pl: int) readonly: csak getter készül assign: nincs retain/release, szimpla értékadás copy: új példány készítése

Autorelease Pool Az eddigi modell jól működik tagváltozók esetében. Viszont lokálisan felhasznált változók, vagy főleg API hívások lokálisan használt eredményei esetén ez nagyon macerás megoldás (mindenre release) Megoldás: Autorelease Pool Az autoreleaselt objektumoknál nem kell foglalkozni a felszabadítással, de csak egy cikluson belül érvényes! NSString* test=@"test"; NSLog(test); test=[nsstring stringwithformat:@"test: %d",2]; NSLog(test);! SomeObject* someobject=[[someobject alloc] init];! [someobject autorelease];

Autorelease Pool működése Start NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Do Something [pool drain]; End

Memória kezelési szabályok Főszabály Azokat az objektumokat kell release, vagy autoreleaseelni, amelyek a birtokunkban vannak Egy objektum akkor kerülhet a birtokunkba, ha a metódus neve, amivel létrehoztuk tartalmazza az alloc, new vagy copy szavakat (pl. alloc, newobject, mutablecopy.), vagy retain-t hívtunk az objektumra. Az objektumot tulajdonjogát, akkor engedjük el, ha release, vagy autorelease-t (releaseld valamikor a jövőben) hívunk rajta.

Build and Analyze Bár a fenti szabályok nem követhetetlenek, nagyon könnyen idézhetünk elő nehezen megtalálható hibákat. Ha kimaradt egy release, akkor memory leaket okoztunk, aminek nincs közvetlen hatása, csak egyszer elfogy a memória. Ha egyel több release van, vagy utána akarunk hozzáférni, akkor kapunk egy BAD_ACCESS hibaüzenetet, amit szintén nehéz megtalálni, mert ki tudja miért volt már a téves felszabadítás. Statikus analizátor: Xcode Build/Build and Analyze

C típusú memóriakezelés Az Objective-C a C kiterjesztése, minden, ami működik C-ben, az működik itt is. Ez sokszor nem a legjobb megoldás, mert nem objektum orientált és még könnyebb hibázni, könnyen okozhatunk buffer overflow-t. Viszont adott esetben nagyon gyors és helytakarékos! typedef struct{!! int x;!! int y;! Point;!! Point* points;! points=malloc(100*sizeof(point));! points[0].x=0;! points[0].y=0;! points[99].x=0;! points[99].y=0;! free(points);

III. Gyakorlat

Mit fogunk csinálni? Egyszerű OOP feladat Van egy ős protokoll (Shape), amelynek az a specialitása, hogy lekérdezhető a területe Ezt megvalósítja két osztály Square, Circle, amelyeket oldalhosszukkal és sugarukkal inicializálunk Van egy Calculator osztály, amely egy statikus metódusban készít egy Circle-t és egy Square-t, majd a területüket összeadja

Az Xcode megnyitása

Új projekt létrehozása

Az Xcode képernyője

Új fájl hozzáadása

Adjunk fájlokat a grouphoz

Shape.h #import <UIKit/UIKit.h> @protocol Shape -(double)getarea; @end

Square.h #import <Foundation/Foundation.h> #import "Shape.h" @interface Square : NSObject <Shape>{! double sidelength; -(id)initwithside:(double)length; @end

Square.m #import "Square.h" @implementation Square -(id)initwithside:(double)length{! self = [super init]; if ( self ) {!! sidelength=length;! return self; -(double)getarea{! return sidelength*sidelength; @end

Circle.h #import <Foundation/Foundation.h> #import "Shape.h" @interface Circle : NSObject <Shape>{! double circleradius; -(id)initwithradius:(double)radius; @end

Circle.m #import "Circle.h" @implementation Circle -(id)initwithradius:(double)radius{! self = [super init]; if ( self ) {!! circleradius=radius;! return self; -(double)getarea{! return circleradius*circleradius*m_pi; @end

Calculator.h #import <Foundation/Foundation.h> @interface Calculator : NSObject { +(double)calculate; @end

Calculator.m #import "Calculator.h" #import "Circle.h" #import "Square.h" @implementation Calculator +(double)calculate{! Circle* circle=[[circle alloc] initwithradius:2.0];! Square* square=[[square alloc] initwithside:2.0];!! id<shape> shapes[2]={circle,square;! double sum=0;! for (int i=0;i<2;i++){!! sum+=[shapes[i] getarea];!! NSLog(@"i: %d %f",i,[shapes[i] getarea]);!! [circle release];! [square release];! return sum; @end

AppDelegate - (BOOL)application:(UIApplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions { // Override point for customization after application launch.! double result=[calculator calculate];! NSString* resultstring=[nsstring stringwithformat:@"result: %f",result];! UIAlertView *alert = [[UIAlertView alloc] initwithtitle:nil message:resultstring!!!!!! delegate:self cancelbuttontitle:@"ok" otherbuttontitles:nil];! [alert show];! [alert release];! [window makekeyandvisible]; return YES;

Az eredmény

Köszönöm a figyelmet! Lazányi Kata kata.lazanyi@ponte.hu