SlideShare a Scribd company logo
iOS: Sviluppo App iPhone &
iPad
Dario Pizzuto

1
Objective-C - 3a parte
2
Objective-C
3
Argomenti
• Array
• Dictionary
• Blocks
• Exceptions
• Key Value Coding
• Key Value Observing
Array
4
Objective-C
5
Array
• Struttura dati composta da un numero
predeterminato di variabili dello stesso tipo
• Objective-C ci fornisce la classe immutabile
NSArray e la classe mutabile
NSMutableArray
• Non possono contenere elementi nil, si usa
NSNull
Objective-C
6
Esempio NSArray
NSArray *people = [[NSArray alloc] init]
Inizializzazione con oggetti
NSArray *people = [[NSArray
arrayWithObjects:obj1, obj2, nil];
oppure
NSArray *people = @[obj1,obj2];
Objective-C
7
NSMutableArray
• Ci permette di manipolare l’array perché
un oggetto mutable
• Es
✓[mutablePeople
insertObject:obj1 atIndex:2]
Dictionary
8
Objective-C
9
Dictionary
• Struttura dati che ci permette di memorizzare
oggetti chiave - valore
• Molto efficiente
• Objective-C ci fornisce la classe immutabile
NSDictionary e la classe mutabile
NSMutableDictionary
• Non possono contenere elementi nil, si usa
NSNull
Objective-C
10
Esempio NSDictionary
NSDictionary *dictPeople = [[NSDictionary
alloc] init]
Inizializzazione con oggetti
NSDictionary *dictPeople = [[NSDictionary
dictionaryWithObjectsAndKeys:obj1, key1, obj2,
key2, nil];
oppure
NSDictionary *dictPeople =
@{key1:obj1,key2:obj2};
Objective-C
11
NSMutableDictionary
• Ci permette di manipolare il dizionario
perché è un oggetto mutable
• Es
✓[mutableDictPeople
removeObjectforKey:key1]
Let’s Code
12
Objective-C
13
Let’s Code
✦Implementare un array che contenga i
nomi dei ragazzi del corso
✦Implementare un dictionary che
contenga come chiave il numero
progressivo assegnato al vostro nome
e come valore il nome
Blocks
14
Objective-C
15
Block
• Insieme di codice in linea
• Tipizzato
• Si usano per comporre espressioni
che possono essere passate come
parametri
Objective-C
16
Block
• Sono particolarmente indicati come
gestori di Callback
• Un block può accedere alle variabili locali
• La sintassi non è intuitiva
• Disponibili da iOS 4
Objective-C
17
Dichiarazione Block
• Prevede l’uso del carattere “^”
(returnType)^(parameters);
• returnType: tipo di valore di ritorno
• parameters: parametri del blocco
Objective-C
18
Esempio Block
int (somma)^(int a, int b);
• Blocco che ritorna la somma tra a e b
Objective-C
19
Esempio Block completo
Objective-C
20
Block
• I blocchi possono leggere e
modificare variabili che stanno fuori
dal blocco
• Utilizzo della keyword __block prima
del tipo di variabile
Objective-C
21
Esempio block sola lettura
Objective-C
22
Errore Block
Objective-C
23
Corretto
Objective-C
24
Block utilizzo
• È buona norma definire un blocco con
typedef
• Può essere utilizzato “in linea” o come
parametro di un metodo
Objective-C
25
Block in linea
typedef double (^area) (double lato);
area areaQuadrato = ^(double lato){
return lato*lato;
};
Objective-C
26
Esempio Block in linea
Objective-C
27
Block parametro metodo
- (void)countString:(NSString*)match
array:(NSArray*)arrayOfString
counter:(void(^)(int counter))counter{
__block int count = 0;
[arrayOfString enumerateObjectsUsingBlock:^(id obj,
NSUInteger idx, BOOL *stop) {
if([(NSString*)obj isEqualToString:match]){
count+=1;
}
}];
counter(count);
}
Objective-C
28
Esempio Block parametro metodo
Exceptions
29
Objective-C
30
Exceptions
• Sono delle interruzioni del programma
dovute ad errori non previsti
• Quando questo accade, viene
“sollevata un’eccezione”
Objective-C
31
Exceptions
• Objective-C ci fornisce degli strumenti
per gestire gli errori imprevisti in 3 parti
1. Istruzioni sottoposte a controllo
2. Routine di controllo dell’errore
3. Blocco di codice eseguito sempre
Objective-C
32
Exceptions
@try
[instructions]
[@catch(specific exceptions)]
[@finally
[instructions] ]
Objective-C
33
Blocco try-catch-finally
• try: istruzioni da controllare
• catch: gestione dell’errore generico o
specifico
• finally: insieme di istruzioni eseguite
sempre
Objective-C
34
Exceptions
• Le eccezioni generiche vengono
identificate con la classe NSException
• Tutti i tipi di eccezione in Objective-C
sono sottoclassi di NSException
Objective-C
35
Esempio exceptions
@try {
NSArray *names =
@[@"Dario",@"Mara",@"Pino"];
NSLog(@"Name: %@",[names objectAtIndex:3]);
}
@catch (NSException *exception) {
NSLog(@"Exception: %@nReason: %@“,
[exception name], [exception reason]);
}
Objective-C
36
Esempio exception
Objective-C
37
Exceptions non gestite
• Nel caso non ci sia il blocco try-catch
per gestire l’eccezione, il programma
si interromperà (crash) e vedremo
nella console lo stacktrace completo
Objective-C
38
Esempio exception non gestita
Objective-C
39
Sollevare exceptions
• Alcune volte è utile generare un’eccezione
• Soprattutto quando realizziamo nostre API
• ES.
✓Parametri metodo a nil
✓Funzionalità non prevista da quel
determinato metodo
Objective-C
40
Sollevare exceptions
• Utilizziamo la direttiva @throw
@throw [NSException
exceptionWithName:@”Errore
parametro” reason:@”Variabile
nulla” userInfo:nil]
Objective-C
41
Exceptions personalizzate
• Se vogliamo definire una NSException
personalizzata, dobbiamo creare una
sottoclasse di quest’ultima
@interface DPPRangeException :
NSException {
...
}
Objective-C
42
Catturare exceptions multiple
• È possibile intercettare, a cascata,
eccezioni multiple
• Definiamo n @catch clause per quante
tipi di eccezioni vogliamo catturare
Objective-C
43
Exceptions multiple
@try {
NSArray *names = @[@"Dario",@"Mara",@"Pino"];
NSLog(@"Name: %@",[names objectAtIndex:3]);
}
@catch (DPPStringException *ex) {
NSLog(@"Exception: %@nReason: %@",[exception name], [exception
reason]);
}
@catch (NSException *ex){
NSLog(@"Exception generica: %@nReason: %@",[exception name],
[exception reason]);
}
Objective-C
44
Clausola finally
• Il blocco di codice all’interno della clausola
finally viene eseguito sempre in seguito alla
valutazione del blocco try
• Nel finally, troviamo spesso operazioni di di
rilascio di risorse
• Se apro un file, è inserisco nel @try le
operazioni di apertura e lettura, posso
sfruttare il @finally per chiudere il buffer
Objective-C
45
Esempio finally
.....
@try {
[self openFile];
@throw [NSException exceptionWithName:@”Errore lettura” reason:@”File non
esistente” userInfo:nil];
[self closeFile] //Mai eseguita
}
@catch (NSException *ex) {
NSLog(@"Exception: %@nReason: %@",[exception name], [exception reason]);
}
@finally {
[self closeFile]; //Chiudo lo stream
}
Let’s Code
46
Objective-C
47
Let’s Code
✦Implementare un blocco try catch
finally che gestisca l’eccezione
sollevata a runtime quando viene
ricercato un elemento in una
posizione inesistente di un array
Key Value Coding
48
Objective-C
49
Key Value Coding - KVC
• Protocol che permette l’accesso alle
properties in modo diretto tramite key
• Le keys corrispondono ai nomi delle
property
• Metodi dichiarati in NSKeyValueCoding
• Buon principio di design del codice
• Permette di semplificare il codice
Objective-C
50
Key Value Coding - KVC
• Metodo valueForKey:
✓Ritorna il valore per la key specificata
• Se la key non viene trovata, viene chiamato
il metodo valueForUndefinedKey:
✓Solleva un’eccezione di tipo
NSUndefinedKeyException
Objective-C
51
Esempio codice
- (id)tableView:(NSTableView *)tableview
objectValueForTableColumn:(id)column row:(NSInteger)row {
ChildObject *child = [childrenArray objectAtIndex:row];
if ([[column identifier] isEqualToString:@"name"]) {
return [child name];
}
if ([[column identifier] isEqualToString:@"age"]) {
return [child age];
}
if ([[column identifier] isEqualToString:@"favoriteColor"]) {
return [child favoriteColor];
}
}
Objective-C
52
Esempio codice con KVC
- (id)tableView:(NSTableView *)tableview
objectValueForTableColumn:(id)column row:
(NSInteger)row {
ChildObject *child = [childrenArray
objectAtIndex:row];
return [child valueForKey:[column
identifier]];
}
Objective-C
53
Key Value Coding - KVC
• Permette anche il set delle properties di
una classe
• Si usa setValue:forKey:
Objective-C
54
Esempio codice con KVC
MyClass *myInstance = [[MyClass
alloc] init];
[myInstance setValue:@2
forKey:@"integerProperty"];
Let’s Code
55
Objective-C
56
Let’s Code
✦Implementare il get e set di una
property di una classe a piacere
attraverso il KVC
Key Value Observing
57
Objective-C
58
Key Value Observing - KVO
• Fornisce la possibilità ad un oggetto, di
ricevere una notifica quando varia la
property di un altro oggetto
• Utile per gestire cambi di visualizzazione o
azioni all’interno della nostra App
• Funzionalità specifica di Objective-C
Objective-C
59
Key Value Observing - KVO
• Supponiamo di avere la seguente
situazione
• Vogliamo sapere quando il nostro
accountBalance varia
Objective-C
60
Key Value Observing - KVO
• l’oggetto PersonObject, registra un
observer sulla property accountBalance
• Metodo
addObserver:forKeyPath:options:context:
Objective-C
61
Key Value Observing - KVO
• Per ricevere la notifica, l’osservatore deve
implementare il metodo
observeValueForKeyPath:ofObject:change:context:
Objective-C
62
Key Value Observing - KVO
• Quando avviene il cambio di valore
nell’attributo accountBalance,
automaticamente viene notificato
all’osservatore
Objective-C
63
Key Value Observing - KVO
• Rimuovere observer quando viene
deallocata la classe altrimenti potremmo
generare dei leaks
• Metodo
removeObserver:forKeyPath:
Objective-C
64
Key Value Observing - KVO
• Non dobbiamo specificare che tipo di notifica
inviare, iOS gestisce autonomamente la
comunicazione
• Non dobbiamo implementare schemi particolari
di gestione per intercettare le modifiche
• Semplice da adottare
Objective-C
65
Ulteriori approfondimenti
NSArray reference
NSDictionary reference
Getting started with blocks
How do I declare a block in Objective-C ?
Objective-C
66
Ulteriori approfondimenti
NSException reference
Key Value Coding
Key Value Observing
Domande ?
67

More Related Content

PPT
Java lezione 2
PDF
JavaScript Object Oriented
PDF
Introduzione a JavaScript
PDF
Lezione 12 (28 marzo 2012) puntatori vettori
PDF
Pillole di C++
PDF
Lezione 10 (21 marzo 2012)2
PPT
Corso c++
PPT
06 1 array_stringhe_typedef
Java lezione 2
JavaScript Object Oriented
Introduzione a JavaScript
Lezione 12 (28 marzo 2012) puntatori vettori
Pillole di C++
Lezione 10 (21 marzo 2012)2
Corso c++
06 1 array_stringhe_typedef

What's hot (9)

PPTX
06 2 vector_matrici
KEY
[Objective-C] - 02 Properties e Costruttori
PDF
Array in C++
PDF
Lezione 3: Connessioni TCP
PPSX
PDF
Lezione 16 (2 aprile 2012)
PPT
07 1 funzioni
PDF
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
PDF
Eserc v del 26 marzo 2012
06 2 vector_matrici
[Objective-C] - 02 Properties e Costruttori
Array in C++
Lezione 3: Connessioni TCP
Lezione 16 (2 aprile 2012)
07 1 funzioni
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Eserc v del 26 marzo 2012
Ad

Similar to iOS_course_7 (11)

PPTX
Corso pratico di C# - 2013
PPTX
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
PDF
iOS_Course_5
PPTX
PDF
Corso Programmazione Java Base
PDF
Ruby in 25 minuti
PPTX
Effective Code Transformations in C++
PPT
Java Lezione 1
PPT
Java codestyle & tipstricks
PDF
Odoo 8.0. Le nuove API.
PPTX
Javascript avanzato: sfruttare al massimo il web
Corso pratico di C# - 2013
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
iOS_Course_5
Corso Programmazione Java Base
Ruby in 25 minuti
Effective Code Transformations in C++
Java Lezione 1
Java codestyle & tipstricks
Odoo 8.0. Le nuove API.
Javascript avanzato: sfruttare al massimo il web
Ad

More from Dario Pizzuto (14)

PDF
iOS_Course_16
PDF
iOS_Course_15
PDF
iOS_Course_14
PDF
iOS_Course_13
PDF
iOS_Course_12
PDF
iOS_Course_11
PDF
iOS_Course_10
PDF
iOS_Course_9
PDF
iOS_Course_8
PDF
iOS_Course_6
PDF
iOS_Course_4
PDF
iOS_Course_3
PDF
iOS_Course_2
PDF
iOS_Course_1
iOS_Course_16
iOS_Course_15
iOS_Course_14
iOS_Course_13
iOS_Course_12
iOS_Course_11
iOS_Course_10
iOS_Course_9
iOS_Course_8
iOS_Course_6
iOS_Course_4
iOS_Course_3
iOS_Course_2
iOS_Course_1

iOS_course_7