31.05.2013 Views

Lesson 7 - Alberto De Bortoli

Lesson 7 - Alberto De Bortoli

Lesson 7 - Alberto De Bortoli

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

iOS Lab for <strong>De</strong>vs<br />

<strong>De</strong>veloping Apps for iPhone and iPad<br />

<strong>Lesson</strong> 7


UIGestureRecognizer<br />

Le UIGestureRecognizer forniscono la possibilità di<br />

aggiungere il riconoscimento di alcune gesture su<br />

qualsiasi UIView.<br />

E’ possibile creare dei nuovi UIGestureRecognizer<br />

(tramite subclassing), ma di default esistono questi:<br />

UIGestureRecognizer<br />

• UITapGestureRecognizer<br />

• UISwipeGestureRecognizer<br />

• UIPinchGestureRecognizer<br />

• UIRotationGestureRecognizer<br />

• UIPanGestureRecognizer<br />

• UILongPressGestureRecognizer


UIGestureRecognizer<br />

La sintassi è la seguente:<br />

UITapGestureRecognizer *tap = [[[UITapGestureRecognizer alloc]<br />

initWithTarget:self<br />

action:@selector(method:)]<br />

autorelease];<br />

[tap setNumberOfTouchesRequired:1];<br />

[tap setNumberOfTapsRequired:1];<br />

[myView addGestureRecognizer:tap];<br />

Signature del selettore:<br />

- (void)method:(UIGestureRecognizer *)recognizer;<br />

La view alla quale viene aggiunta la gesture farà retain<br />

della gesture stessa e si occuperà di rilasciarla nella<br />

propria fase di dealloc (automatico).


UIGestureRecognizer<br />

Esiste un protocollo per le UIGestureRecognizer che<br />

definisce questi metodi opzionali:<br />

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer<br />

*)gestureRecognizer;<br />

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer<br />

shouldRecognizeSimultaneouslyWithGestureRecognizer:<br />

(UIGestureRecognizer *)otherGestureRecognizer;<br />

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer<br />

shouldReceiveTouch:(UITouch *)touch;


UIImagePickerController<br />

L’UIImagePickerController è un view<br />

controller che facilita l’accesso alle<br />

immagini salvate nella galleria del<br />

device e alla fotocamera.<br />

Fornisce un’interfaccia predefinita da<br />

Apple e un protocollo<br />

UIImagePickerController<strong>De</strong>legate.<br />

E’ presentabile come un qualsiasi<br />

altro UIViewController e bisogna<br />

configurarne la proprietà sourceType.


<strong>De</strong>bugging techniques and<br />

performance tuning


Premessa:<br />

LLVM 3.0 è il compilatore di<br />

nuova generazione adottato da<br />

Apple.<br />

E’ il default ed è<br />

obbligatorio in<br />

Xcode 4.2.<br />

GCC deprecato.<br />

Reference: llvm.org/<br />

LLVM e GCC


<strong>De</strong>bugging techniques and<br />

performance tuning<br />

Vedremo concetti riguardanti:<br />

• Breakpoints<br />

• Stack trace<br />

• Leaks<br />

• Heap<br />

• Memory Warnings<br />

• Zombies objects<br />

• SIGABRT and EXC_BAD_ACCESS exceptions<br />

• objc_exception_throw breakpoint<br />

• treats warnings as errors (direttiva di compilazione)<br />

• Instruments<br />

• CLANG static analyzer


Enable Zombie Objects 1/2<br />

Quando un oggetto viene deallocato, viene cancellato dalla<br />

memoria. In particolare con l’uso del messaggio autorelease,<br />

l’oggetto viene rilasciato (e deallocato) in un tempo successivo a noi<br />

sconosciuto. Se successivamente tentiamo di accedere all’oggetto,<br />

l’applicazione crasha a causa di un dangling pointer.<br />

In tal caso è estremamente comodo abilitare la modalità “oggetti<br />

zombie”: quando un oggetto deve venire deallocato in realtà esso<br />

viene marcato come “zombie” ma rimane in memoria. Al successivo<br />

accesso (errato) possiamo dunque avere informazioni in console su<br />

che tipo di oggetto era stato referenziato al posto di avere un log<br />

pressoché inutile quale ‘message sent to deallocated instance’ che<br />

non ci farebbe (neanche lontanamente) sapere su quale oggetto<br />

stiamo gestendo la memoria in maniera errata.


Enable Zombie Objects 2/2


objc_exception_throw<br />

breakpoint<br />

In Objective-C non si usa spesso il try-catch e di solito le eccezioni<br />

arrivano al main (senza mai essere catturate).<br />

In tal caso (e senza il breakpoint objc_exception_throw abilitato) il<br />

debugging è difficile e non si riesce a risalire allo statement scatenante<br />

l’eccezione.<br />

objc_exception_throw blocca l’esecuzione al momento del lancio<br />

dell’eccezione.


CLANG static Analyzer<br />

Rileva leak dovuti a una gestione scorretta di retain e release.


Analizzatore di performance:<br />

• Memory allocations<br />

• Leaks<br />

• Network activity<br />

• CPU usage<br />

• ...<br />

Tool disponibile con Xcode<br />

Instruments


ARC 1/5<br />

(Automatic Reference Counting)<br />

*ARC è una killer feature. Punto.*<br />

La gestione della memoria può essere ardua.<br />

• I problemi portano a crash<br />

• i crash causano stress<br />

• lo stress causa il rifiuto dell’app dall’App Store<br />

• il rifiuto dell’app dallo store causa stress<br />

*** non ci piace lo stress ***<br />

Programmare con le regole MRC (Manual Reference Counting, retain/release)<br />

dovrebbe essere banale ma... ci sono molti dettagli... autorelease pools...<br />

ARC formalizza le convenzioni e automatizza le regole.


Cosa fa ARC:<br />

ARC 2/5<br />

A compile time, il compilatore aggiunge retain/release/autorelease al posto del<br />

programmatore.<br />

Tali operazioni sono decidibili (matematicamente).


Cosa NON è ARC:<br />

• No new runtime memory model<br />

• No automation for malloc/free, etc.<br />

• No garbage collector<br />

• No heap scans<br />

• No whole app pauses<br />

• No non-deterministic releases<br />

ARC 3/5<br />

Cosa è ARC:<br />

• Direttiva di compilazione (Project settings in Xcode)<br />

• retain -> strong<br />

• assign -> unsafe_unretained<br />

• assign -> weak (per gli oggetti, set to nil automaticamente, no dangling<br />

pointers)


ARC 4/5<br />

Migrare codice esistente ad ARC<br />

• Rimuovere tutte le chiamate a<br />

retain, release, autorelease;<br />

• Rimpiazzare<br />

NSAutoreleasePool con<br />

@autoreleasepool;<br />

• @property(assign) diventano<br />

@property(weak) per<br />

puntatori a oggetti.


Pro<br />

ARC 5/5<br />

ARC<br />

(automatic)<br />

• no memory<br />

management,<br />

• gestione memoria<br />

determinata a<br />

compile time dal<br />

compilatore<br />

MRC<br />

(manual)<br />

• gestione memoria<br />

determinata a<br />

compile time<br />

Cons ∅ • manuale, soggetta<br />

a errori del<br />

programmatore<br />

Garbage<br />

Collector<br />

• no memory<br />

management<br />

• demone a runtime<br />

(gestione<br />

memoria eseguita<br />

a runtime)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!