Lesson 7 - Alberto De Bortoli
Lesson 7 - Alberto De Bortoli
Lesson 7 - Alberto De Bortoli
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)