Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

37
MOBILE APPS CON OBJECTIVE-C DAY 01 12/NOVEMBRE/2011 alberto pasca | [email protected] www.cutaway.it

description

Technical speech per objectivec e ios versione 3.1. Argomenti trattati: ~ origini ~ Xcode ~ Interface Builder ~ Intruments / Profiler ~ sintassi ~ gestione della memoria ~ esempi Source code / esempi: https://github.com/elpsk

Transcript of Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

Page 1: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

MOBILE APPS CON

OBJECTIVE-C

DAY 01 12/NOVEMBRE/2011

alberto pasca | [email protected]

Page 2: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

contents | day 01 origini Xcode, Interface Builder, Instruments framework base sintassi gestione memoria esempi pratici

Mobile Apps con Objective-c | alberto pasca

slide 1/2810

Page 3: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

origini

Mobile Apps con Objective-c | alberto pasca

Page 4: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

originiMobile Apps con Objective-c |

alberto pasca

SmallTalk + C = OOPC + frameworks = Objective-C

?GCC

ObjC

OOPC

Page 5: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

origini - devicesMobile Apps con Objective-c |

alberto pasca

Display: 320x480

AccelerometroProssimitàGps / WifiBluetooth

Ram 128Mb -> 512MbCPU 412Mhz -> 2x800Mhz

Retina display 640x960

Display: 768x1024

AccelerometroProssimitàGps / WifiBluetooth

Ram 256Mb -> 512MbCPU 1Ghz -> 2x880Mhz

iPod - iPhone 3G / 3GS / 4 / 4S - iPad / iPad2

Page 6: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

xcode

Mobile Apps con Objective-c | alberto pasca

Page 7: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

Cosa vedremo…

• xcode• configurazione• target• file.plist• alberatura progetto• interface builder• la window• le view• i componenti• IBAction• IBOutlet• frameworksLezione_00_Xcode

xcode – codeMobile Apps con Objective-c |

alberto pasca

Page 8: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

frameworks

Mobile Apps con Objective-c | alberto pasca

Page 9: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

Principali:prefix

Foundation (NS) UIKit (UI) QuartzCore (CA) CoreGraphics (CG) CoreLocation (CL)

frameworks – introMobile Apps con Objective-c |

alberto pasca

Librerie software che aumentano le funzionalità di una classe

http://tinyurl.com/objc-prefix

Page 10: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

Foundation

NSObjectNSStringNSNumberNSArrayNSDictionaryNSUrlNSTimer

NSNotificationNSException[…]

frameworksMobile Apps con Objective-c |

alberto pasca

UIKit

UIViewUIWindowUIButtonUILabel

UITableView

UITextFieldUISlider

UIWebViewUIDeviceUIEvent[…]

CoreGraphics

CGColor

CGContext

CGFont

CGGradient

CGImage

CGLayer

CGPDFPage

[…]

Page 11: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

frameworksMobile Apps con Objective-c |

alberto pasca

CoreLocation

CLGeocoderCLHeadingCLLocation

CLLocationManager

CLPlacemarkCLRegion[…]

QuartzCore

CAAnimation

CABasicAnimationCALayer

CAScrollLayer

CATiledLayerCATransition[…]

Page 12: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi

Mobile Apps con Objective-c | alberto pasca

Page 13: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – variabili#define Moltiplica(x,y) (x*y)

const int valore = 28;

int val = 0;

double val = .5;

float val = 10.;

char val = 'a';

BOOL val = YES | NO;

NSString *val = @"stringa";

id val = MyClass | MyObject;

SEL selector = @selector(MyMethod);

Mobile Apps con Objective-c | alberto pasca

Dynamic Typing

Tipi base > ereditati dal C

Tipi speciali > ereditati da SmallTalk ed aggiunti in ObjC

Ogni oggetto va dicharato come un puntatore!

Page 14: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – operatoriMobile Apps con Objective-c |

alberto pasca

Aritmetici+ - * / %

Assegnamento+= -= *= /= %=++ --

Comparazione== != > < >= <=

Bit<<= >>= &= |= ^=

Ternari

[condition] ? [true] : [false]

myvar = x == y ? y <= z ? y : x != j ? k >= j ? k : j : x : "omg_i_did_again”;

Page 15: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – loggingMobile Apps con Objective-c |

alberto pasca

NSLog(@”Log string!”);

Formati: %@ -> descrizione oggetto %d - %u -> int / uint %f - %e -> float / exp %c - %C -> char 8b / char 16b %s - %S -> null-terminated char 8/16 %p -> pointer 0x %x - %X -> hex lowercase/uppercase

NSLog(@”tricks: %s - %d - %s",

__FUNCTION__, __LINE__, __FILE__);

Page 16: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – cicli e condizioni

for ( int i=0; i<28; i++ ) {

NSLog(@"I: %d", i);

}

int i=28;

while ( i != 0 ) {

NSLog(@"I: %d", --i);

}

int i=28;

do {

NSLog(@"I: %d", i--);

} while ( i!=0 );

Mobile Apps con Objective-c | alberto pasca

if ( i==28 ){

NSLog(@"28!!!");

} else {

NSLog(@"I: %d", i);

}

switch ( i ) {

case 1:

NSLog(@"UNO");

break;

case 2:

NSLog(@"DUE");

break;

default: break;

}

FOR

WHILE

DO-WHILE

IF - ELSE

SWITCH

Page 17: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – enumerazioni

aClass *class = [[aClass alloc] init];

NSArray *arr = [NSArray arrayWithObjects:class, class, class, nil];

int tot = [arr count];for ( int i=0; i<=tot; i++ ) NSLog(@"STR: %@", [arr objectAtIndex:i]);

for (aClass *c in arr) NSLog(@"STR: %@", [c description]);

NSEnumerator *en = [arr objectEnumerator];while (class == [en nextObject] ) [class doWork];

Mobile Apps con Objective-c | alberto pasca

CLASSICO

FOREACH

ENUM

Page 18: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi - metodi

Senza parametri:C -> oggetto.Metodo();

OBJC -> [oggetto Metodo];

Con parametri:C -> oggetto.Metodo(5, "pippo");

OBJC -> [oggetto MetodoConNumero:5 andStringa:@"pippo"];

Non si chiama un metodo ma si invia un messaggio!

Mobile Apps con Objective-c | alberto pasca

- (void) Metodo;- (void) MetodoConNumero:(int)num andStringa:(NSString*)str;

Page 19: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – classi (gerarchia)

NSObject

NSArray NSString UIResponder

UIView

UIControl

UITextField UISlider

UILabel

CLASSEDescrizione astratta che definisce il comportamento di un oggetto.

OGGETTOÈ un entità appartenente alla classe, con un proprio stato e comportamento.

Mobile Apps con Objective-c | alberto pasca

Page 20: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – classi (interface)

#import "aSuperClass.h”

#import <aSuperClass.h>

#include "aSuperClass.h”

#include <aSuperClass.h>

@class aSuperClass;

@interface MyClass: aSuperClass {

int pippo;

}

-/+ (void) mioMetodo;

@end

.H Dichiarazione di variabili e prototipi dei metodi

Mobile Apps con Objective-c | alberto pasca

inclusione lib/classi

Variabili

Metodi

Page 21: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – classi (implementation)

#import "MyClass.h"

@implementation MyClass

- (void) mioMetodoIstanza {

// implementazione

}

+ (void) mioMetodoDiClasse {

// implementazione

}

@end

Mobile Apps con Objective-c | alberto pasca

.M Implementazione metodi

Fine implementazione

Inizio implementazione

Implementazione metodi

Page 22: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – proprietà

nonatomic+

readonly vs readwrite+

retain vs assign vs copy

Mobile Apps con Objective-c | alberto pasca

Creano i Getters / Setters per una variabile tramite le keywords @property (file .H) e @syntetize/@dynamic

(file .M)

mu

tually

exclu

siv

e

Page 23: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – proprietàMobile Apps con Objective-c |

alberto pasca

oggetto0x01retain

assign

oggetto0x02copy

0x01

+1

+0

+1

@property (nonatomic, assign) int CurrentGameLevel;

Page 24: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – proprietàMobile Apps con Objective-c |

alberto pasca

- (void) setVal:(NSString*)v { variabile = v; }

- (void) setVal:(NSString*)v {

if ( v != variabile ) {

[variabile release];

variabile = [v copy];

}

}

- (void) setVal:(NSString*)v {

if ( v != variabile ) {

[variabile release];

variabile = [v retain];

}

}

assign

copy

retain

Page 25: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – oggetti

Creazione oggetti:Auto car = new Auto();Auto *car = [[Auto alloc] init];

Rilascio oggetti:if (car != nil) [car release];

Mobile Apps con Objective-c | alberto pasca

Invece di invocare dei metodi, si chiede all’oggetto in questione di fare qualcosa..

alloc + init è il pattern di defaul per creare un

oggetto!

Page 26: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – forwarding

Invio di messaggi ad oggetti non specificati nell’interfaccia o addirittura non esistenti !

id delegate;isKindOfClass - respondsToSelector

- (void) sendMessage {

if ([delegate isKindOfClass:[MyClass class]])

if ([delegate respondsToSelector:@selector(method)])

[delegate method];- }

Mobile Apps con Objective-c | alberto pasca

Page 27: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – protocolli

Callback Ereditarietà multipla Il metodo chiamato potrebbe non

esistere! Protocolli formali / informali, o meglio… @required e @optional

@protocol ClassDelegate

- (void) HoFinitoFaiQualcosa;

@end

Mobile Apps con Objective-c | alberto pasca

Scambiano messaggi tra le classi o le interfaccie stesse

Page 28: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – categorie

#import <Foundation/Foundation.h>

@interface NSString (HtmlStrings)

- (BOOL) isUrl;

@end

#import "NSString+Html.h"

@implementation NSString (HtmlStrings)

- (BOOL) isUrl {

if ( [self hasPrefix:@"http://"] )

return YES;

return NO;

}

@end

Mobile Apps con Objective-c | alberto pasca

Permettono di aggiungere funzionalità ad oggetti esistenti e compilati

Utilizzo:

#import “NSString+Html.h”

NSString *Str = @"http://www.cutaway.it"; if ( [Str isUrl] ) return YES;

La classe NSString ha un nuovo metodo!

Page 29: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

sintassi – codeMobile Apps con Objective-c |

alberto pasca

Cosa vedremo…

• main• application delegate• view controller• variabili• cicli• enumerazioni• classi• metodi (pubblici /

privati)• protocolli• categorie• properties• debug• log informations

Lezione_01_Sintassi

Page 30: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

gestione della memoria

Mobile Apps con Objective-c | alberto pasca

Page 31: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

memoria – alloc / releaseMobile Apps con Objective-c |

alberto pasca

Basata sui REFERENCE COUNT Oggetti creati con pattern ALLOC INIT hanno

RETAIN COUNT +1 Ogni oggetto rilasciato con RELEASE ha un RC di -1 Quando RC è 0 viene chiamato il distruttore

(dealloc)

Page 32: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

memoria – oggetti in autorelease

Mobile Apps con Objective-c | alberto pasca

NSMutableArray *arr1 = [[NSMutableArray alloc] init];

// do somethings

[arr1 release];

NSMutableArray *arr2 = [[[NSMutableArray alloc] init] autorelease];

NSMutableArray *arr3 = [NSMutableArray array];

NSMutableArray *arr4 =

[NSMutableArray arrayWithObjects:@"a", @"b", nil];

NSMutableArray *arr5 =

[NSMutableArray alloc] initWithObjects:@"a", @"b", nil];

1

2

3

4

5

Page 33: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

memoria - leaksMobile Apps con Objective-c |

alberto pasca

- (void) leakyMethod { // This is a leak NSArray *array = [[NSArray alloc] init]; }

• MEMORY LEAK

• CLANG_STATIC_ANALYZER

• INSTRUMENTS

Page 34: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

memoria - autorelease

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

[...]

[pool drain];

[pool release]; // ci pensa il drain a fare il release in ambienti RC!

Il pool invia automaticamente un RELEASE a tutti gli oggetti del pool, pertanto la responsabilità di release passa al POOL.

Command-Line App Cicli con molti oggetti temporanei Thread

Mobile Apps con Objective-c | alberto pasca

AUTORELEASE POOL

Page 35: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

memoria – zombie

NSZombieEnabled = YES;

Mobile Apps con Objective-c | alberto pasca

1 - EXC_BAD_ACCESS

NSString *myString;

- (void)viewDidLoad { myString = [NSString stringWithFormat:@”asd"]; NSLog(@"%@", myString); // OK}- (void) aMethod { NSLog(@"%@", myString); // EXC_BAD_ACCESS}

2 – [myString] message sent to deallocated instance 0x5633b0

Page 36: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

Cosa vedremo…

• alloc + init• release• retain count• memory leak• autorelease• autorelease pool• runtime error• EXC_BAD_ACCESS• NSZombie• Instruments• debug

Lezione_02_Memoria

memoria – codeMobile Apps con Objective-c |

alberto pasca

Page 37: Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02

# EOF - day 01Coming next:

• Interfacce grafiche• Eventi• Foundation.framework• Persistenza dati• Librerie di sistema• Librerie esterne

tks

Mobile Apps con Objective-c | alberto pasca