iOS: Sviluppo App iPhone & 
iPad 
Dario Pizzuto 
1
Objective-C - 2a parte 
2
Objective-C 
Argomenti! 
• Gestione Memoria! 
• Property! 
• Category! 
• Protocol 
3
Gestione della memoria 
4
Objective-C 
• Objective-C usa il reference counting! 
• Ogni oggetto ha un retain count che 
inizialmente vale 1! 
• Ogni volta che l’oggetto viene usato, il 
contatore viene incrementato (retain) 
5
Objective-C 
! 
• Quando l’oggetto non viene usato il 
contatore viene decrementato 
(release)! 
• Se il retain count diventa 0, il runtime 
6 
invoca il dealloc
Objective-C 
7
Objective-C 
• Gestione molto efficiente! 
• Ogni chiamata viene gestita 
manualmente! 
• Soggetto ad errori dello sviluppatore 
8
Objective-C 
• Esistono modi più “semplici”! 
• Gestione automatica retain/release 
9
Automatic Reference 
Counting 
10
Objective-C 
• Gestione automatica memoria! 
• Supporto a partire da iOS 4.3! 
• Lo sviluppatore non si deve 
preoccupare di allocare o deallocare 
oggetti! 
• Ci sono delle regole 
11
Objective-C 
Tipi! 
• __strong! 
• __weak! 
• __unsafe_unretained! 
• __autoreleasing 
12
Objective-C 
__strong! 
• L’oggetto rimane vivo fino a quando ci 
sono riferimenti forti ad esso! 
• Impostazione di default 
13 
!
Objective-C 
__weak! 
• Non mantiene vivo l’oggetto! 
• Quando non ci sono riferimenti forti 
all’oggetto viene impostato a nil 
14 
!
Objective-C 
__unsafe_unretained! 
• Non mantiene vivo l’oggetto! 
• Al contrario di __weak, quando un 
oggetto viene deallocato non viene 
impostato a nil 
15 
!
Objective-C 
__autoreleasing! 
• Usato per parametri passati per 
riferimento (puntatore)! 
• Vengono rilasciati automaticamente 
all’interno del metodo in cui si trovano 
16
Ciclo di ritenzione 
17
Objective-C 
Ciclo di ritenzione! 
• Si verifica quando due oggetti hanno 
riferimenti strong tra di essi! 
• Oggetto A contiene riferimento strong 
ad Oggetto B! 
• Oggetto B contiene riferimento strong 
18 
ad Oggetto A
Objective-C 
Ciclo di ritenzione! 
• In tal caso nessuno dei due viene 
deallocato! 
• Se l’oggetto padre che li contiene 
viene rilasciato, si genera un memory 
leak 
19
Objective-C 
Esempio retain cycle! 
@interface DPPGenitore : NSObject{! 
DPPFiglio *figlio;! 
}! 
! 
@interface DPPFiglio : NSObject{! 
DPPGenitore *genitore;! 
20 
}!
Perché è un ciclo di 
ritenzione ? 
21
Si verifica perché di 
default le varibili di 
istanza sono __strong 
22
Objective-C 
Risoluzione retain cycle! 
• Si attribuisce __weak in una delle due 
variabili di istanza 
23 
!
Category 
24
Objective-C 
25 
Category! 
• Ci permette di estendere il contenuto 
della classe di riferimento! 
• “Decora” classi e oggetti ! 
• Non esiste un corrispettivo negli altri 
linguaggi di programmazione 
!
Objective-C 
Category! 
• Possiamo aggiungere category ad 
una classe scritta da altri di cui non si 
conosce il codice! 
• Elemento di programmazione molto 
26 
potente
Objective-C 
27 
Esempio Category! 
! 
@interface ClassName (CategoryName)! 
[Methods]! 
@end!
Objective-C 
Category! 
• Attenzione ai nomi dei metodi nella 
category! 
• Possibilità di conflitti! 
• Utilizzo del prefix! 
28 
!
Objective-C 
Category! 
• Calcolo età delle persone in array! 
29 
! 
@interface NSArray (DPPPersona)! 
- (int)sumAges;! 
@end!
Objective-C 
Category! 
• Per utilizzare una category, bisogna 
importare il file di interfaccia nel file in 
cui deve essere utilizzata! 
! 
#import “NSString+DPPPersona.h” 
30
Objective-C 
Creare una Category! 
• File -> New -> File! 
31 
! 
! 
!
Objective-C 
32 
Creare una Category 
! 
! 
! 
! 
!
Objective-C 
33 
Category name 
Classe da estendere
Objective-C 
34 
Interface file
Objective-C 
35 
Implementation file
Objective-C 
36 
Uso della category
Let’s Code 
37
Objective-C 
Let’s Code! 
✦Implementare una category ad una 
classe a vostra scelta 
38
Protocol 
39
Objective-C 
40 
Protocol! 
• Definisce metodi che possono essere implementati 
dalla classe! 
• Può essere paragonato alle interfacce di Java o C#! 
• Deve essere implementato dalla classe che è 
conforme a quel protocollo! 
• È svincolato da una classe difatti più classi 
possono essere conformi allo stesso protocollo
Objective-C 
Protocol: definizione! 
• Un protocollo viene indicato con la 
keyword @protocol! 
@protocol ProtocolName! 
[Methods declarations]! 
41 
@end
Objective-C 
Protocol! 
• È un “comportamento” che la classe 
può decidere di seguire! 
• Contiene sia definizioni obbligatorie 
42 
che opzionali
Objective-C 
Protocol: metodi obbligatori! 
• Sono metodi che, se una classe è 
conforme ad un determinato 
protocollo, deve seguire! 
• Se non implementiamo un metodo 
obbligatori, il compilatore solleva un 
warning 
43
Objective-C 
Protocol: metodi opzionali! 
• Sono metodi che, in quanto opzionali, 
possono non essere implementati! 
• Si definiscono con la keyword 
44 
@optional
Objective-C 
Protocol utilizzo! 
• Quando una classe è conforme ad un 
protocollo si specifica il nome del 
protocollo tra parentesi angolari! 
@interface ClassName <elenco protocolli>! 
@end 
45
Objective-C 
Esempio Protocol! 
@interface DPPPersona : NSObject 
<NSCopying, NSCoding>! 
@end! 
46
Objective-C 
Creare una Protocol! 
• File -> New -> File! 
47 
! 
! 
!
Objective-C 
48
Objective-C 
49 
Protocol name
Objective-C 
Esempio Protocol! 
• Verrà creato un solo file .h! 
! 
! 
! 
50
Objective-C 
Esempio Protocol! 
@protocol DPPPrintable_Delegate < 
NSObject>! 
- (void)print;! 
! 
@optional! 
- (void)printWellFormatted;! 
@end ! 
51
Objective-C 
DPPProtocolTest Interface! 
! 
! 
! 
! 
! 
! 
52
Objective-C 
DPPProtocolTest Implementation! 
! 
! 
! 
! 
! 
! 
53
Objective-C 
Test Protocollo 
54
Objective-C 
Ancora sui Protocolli...! 
• È possibile sapere se una classe è conforme ad uno 
specifico protocollo! 
• Si usa il metodo della classe NSObject 
conformsToProtocol! 
• È possibile avere ereditarietà tra i protocolli! 
• Se il protocollo_1 è conforme al protocollo_2 e 
protocollo_3, la classe che è conforme a protocollo_1 
sarà di default conforme a protocollo_2 e protocollo_3! 
55
Objective-C 
Test conformità protocollo 
56
Let’s Code 
57
Objective-C 
Let’s Code! 
✦Implementare un protocollo a vostra 
58 
scelta
Property 
59
Objective-C 
Property! 
• Permettono di accede a specifiche 
informazioni senza violare l’incapsulamento! 
• Le property sono visibili all’esterno! 
• Si dichiarano nel file di interfaccia! 
• Diatriba tra property e iVar! 
60
Objective-C 
Dichiarare una property 
@property(attributes) type name ;! 
! 
• attributes: opzionale, indica attributi sulla 
property;! 
• type: tipo di dato della property! 
• name: nome che vogliamo assegnare 
61
Objective-C 
Property! 
• getter: definiamo come getter il metodo che ci 
restituisce il valore della property ! 
• setter: definiamo come setter il metodo che 
invochiamo per impostare il valore della property! 
• getter e setter: il compilatore definisce 
implicitamente i due metodi ! 
62
Objective-C 
Esempio getter! 
• - (tipo) propertyName 
! 
✓Es. [self age]! 
63
Objective-C 
Esempio setter! 
• - (void)setPropertyName:(tipo) propertyVal 
! 
✓ Es. [self setAge:42]! 
64
Objective-C 
Attributi di una property! 
• getter = getterName: consente di personalizzare 
il nome del getter;! 
• setter = setterName: consente di personalizzare 
il nome del setter;! 
• readwrite: (default) indica che la property è di 
65 
lettura e scrittura
Objective-C 
Attributi di una property! 
• readonly: indica che una property è di sola 
lettura, mutuamente esclusivo con readwrite! 
• assign: (default) indica che è valorizzata come 
assegnazione di parametro e si usa solo con 
primitive (int, long, BOOL)! 
• retain: indica l’invocazione del retain sul 
parametro ricevuto nel setter, mutuamente 
esclusivo con assign e copy 
66
Objective-C 
Attributi di una property! 
• copy: indica la creazione di una copia del 
parametro, mutuamente esclusivo con assign e 
retain! 
• nonatomic: specifica che non il parametro non è 
Thread Safe (concorrenza di accesso alla 
property)! 
• atomic: (default) indica che la property è Thread 
67 
Safe
Objective-C 
Attributi di una property! 
• strong: indica un riferimento forte al parametro, 
equivalente a retain! 
• weak: indica un riferimento debole al parametro, 
68 
equivalente ad assign
Objective-C 
Esempio property 
69
Objective-C 
Property synthesize! 
• Di base il compilatore crea la variabile 
_propertyName per accedere alla property 
nell’implementazione (auto-synthesize)! 
• @synthesize: keyword che permette di 
rinominare la property nell’implementazione! 
• Es. ! 
✓@synthesize _name = name 
70
Objective-C 
Ancora sulla property! 
• Può essere dichiarata all’interno di un Protocol! 
• In questo caso, la classe che implementa il 
protocollo ne deve definire getter e setter! 
• Utilizzo obbligatorio di @synthesize 
71
Let’s Code 
72
Objective-C 
Let’s Code! 
✦Implementare una classe che 
contenga 3 properties di tipi differenti 
73
Objective-C 
! 
Ulteriori approfondimenti! 
Memory Management! 
Category! 
Protocol! 
Property! 
Good attributes explanation! 
74
Domande ? 
75

iOS_Course_6

  • 1.
    iOS: Sviluppo AppiPhone & iPad Dario Pizzuto 1
  • 2.
  • 3.
    Objective-C Argomenti! •Gestione Memoria! • Property! • Category! • Protocol 3
  • 4.
  • 5.
    Objective-C • Objective-Cusa il reference counting! • Ogni oggetto ha un retain count che inizialmente vale 1! • Ogni volta che l’oggetto viene usato, il contatore viene incrementato (retain) 5
  • 6.
    Objective-C ! •Quando l’oggetto non viene usato il contatore viene decrementato (release)! • Se il retain count diventa 0, il runtime 6 invoca il dealloc
  • 7.
  • 8.
    Objective-C • Gestionemolto efficiente! • Ogni chiamata viene gestita manualmente! • Soggetto ad errori dello sviluppatore 8
  • 9.
    Objective-C • Esistonomodi più “semplici”! • Gestione automatica retain/release 9
  • 10.
  • 11.
    Objective-C • Gestioneautomatica memoria! • Supporto a partire da iOS 4.3! • Lo sviluppatore non si deve preoccupare di allocare o deallocare oggetti! • Ci sono delle regole 11
  • 12.
    Objective-C Tipi! •__strong! • __weak! • __unsafe_unretained! • __autoreleasing 12
  • 13.
    Objective-C __strong! •L’oggetto rimane vivo fino a quando ci sono riferimenti forti ad esso! • Impostazione di default 13 !
  • 14.
    Objective-C __weak! •Non mantiene vivo l’oggetto! • Quando non ci sono riferimenti forti all’oggetto viene impostato a nil 14 !
  • 15.
    Objective-C __unsafe_unretained! •Non mantiene vivo l’oggetto! • Al contrario di __weak, quando un oggetto viene deallocato non viene impostato a nil 15 !
  • 16.
    Objective-C __autoreleasing! •Usato per parametri passati per riferimento (puntatore)! • Vengono rilasciati automaticamente all’interno del metodo in cui si trovano 16
  • 17.
  • 18.
    Objective-C Ciclo diritenzione! • Si verifica quando due oggetti hanno riferimenti strong tra di essi! • Oggetto A contiene riferimento strong ad Oggetto B! • Oggetto B contiene riferimento strong 18 ad Oggetto A
  • 19.
    Objective-C Ciclo diritenzione! • In tal caso nessuno dei due viene deallocato! • Se l’oggetto padre che li contiene viene rilasciato, si genera un memory leak 19
  • 20.
    Objective-C Esempio retaincycle! @interface DPPGenitore : NSObject{! DPPFiglio *figlio;! }! ! @interface DPPFiglio : NSObject{! DPPGenitore *genitore;! 20 }!
  • 21.
    Perché è unciclo di ritenzione ? 21
  • 22.
    Si verifica perchédi default le varibili di istanza sono __strong 22
  • 23.
    Objective-C Risoluzione retaincycle! • Si attribuisce __weak in una delle due variabili di istanza 23 !
  • 24.
  • 25.
    Objective-C 25 Category! • Ci permette di estendere il contenuto della classe di riferimento! • “Decora” classi e oggetti ! • Non esiste un corrispettivo negli altri linguaggi di programmazione !
  • 26.
    Objective-C Category! •Possiamo aggiungere category ad una classe scritta da altri di cui non si conosce il codice! • Elemento di programmazione molto 26 potente
  • 27.
    Objective-C 27 EsempioCategory! ! @interface ClassName (CategoryName)! [Methods]! @end!
  • 28.
    Objective-C Category! •Attenzione ai nomi dei metodi nella category! • Possibilità di conflitti! • Utilizzo del prefix! 28 !
  • 29.
    Objective-C Category! •Calcolo età delle persone in array! 29 ! @interface NSArray (DPPPersona)! - (int)sumAges;! @end!
  • 30.
    Objective-C Category! •Per utilizzare una category, bisogna importare il file di interfaccia nel file in cui deve essere utilizzata! ! #import “NSString+DPPPersona.h” 30
  • 31.
    Objective-C Creare unaCategory! • File -> New -> File! 31 ! ! !
  • 32.
    Objective-C 32 Creareuna Category ! ! ! ! !
  • 33.
    Objective-C 33 Categoryname Classe da estendere
  • 34.
  • 35.
  • 36.
    Objective-C 36 Usodella category
  • 37.
  • 38.
    Objective-C Let’s Code! ✦Implementare una category ad una classe a vostra scelta 38
  • 39.
  • 40.
    Objective-C 40 Protocol! • Definisce metodi che possono essere implementati dalla classe! • Può essere paragonato alle interfacce di Java o C#! • Deve essere implementato dalla classe che è conforme a quel protocollo! • È svincolato da una classe difatti più classi possono essere conformi allo stesso protocollo
  • 41.
    Objective-C Protocol: definizione! • Un protocollo viene indicato con la keyword @protocol! @protocol ProtocolName! [Methods declarations]! 41 @end
  • 42.
    Objective-C Protocol! •È un “comportamento” che la classe può decidere di seguire! • Contiene sia definizioni obbligatorie 42 che opzionali
  • 43.
    Objective-C Protocol: metodiobbligatori! • Sono metodi che, se una classe è conforme ad un determinato protocollo, deve seguire! • Se non implementiamo un metodo obbligatori, il compilatore solleva un warning 43
  • 44.
    Objective-C Protocol: metodiopzionali! • Sono metodi che, in quanto opzionali, possono non essere implementati! • Si definiscono con la keyword 44 @optional
  • 45.
    Objective-C Protocol utilizzo! • Quando una classe è conforme ad un protocollo si specifica il nome del protocollo tra parentesi angolari! @interface ClassName <elenco protocolli>! @end 45
  • 46.
    Objective-C Esempio Protocol! @interface DPPPersona : NSObject <NSCopying, NSCoding>! @end! 46
  • 47.
    Objective-C Creare unaProtocol! • File -> New -> File! 47 ! ! !
  • 48.
  • 49.
  • 50.
    Objective-C Esempio Protocol! • Verrà creato un solo file .h! ! ! ! 50
  • 51.
    Objective-C Esempio Protocol! @protocol DPPPrintable_Delegate < NSObject>! - (void)print;! ! @optional! - (void)printWellFormatted;! @end ! 51
  • 52.
  • 53.
  • 54.
  • 55.
    Objective-C Ancora suiProtocolli...! • È possibile sapere se una classe è conforme ad uno specifico protocollo! • Si usa il metodo della classe NSObject conformsToProtocol! • È possibile avere ereditarietà tra i protocolli! • Se il protocollo_1 è conforme al protocollo_2 e protocollo_3, la classe che è conforme a protocollo_1 sarà di default conforme a protocollo_2 e protocollo_3! 55
  • 56.
  • 57.
  • 58.
    Objective-C Let’s Code! ✦Implementare un protocollo a vostra 58 scelta
  • 59.
  • 60.
    Objective-C Property! •Permettono di accede a specifiche informazioni senza violare l’incapsulamento! • Le property sono visibili all’esterno! • Si dichiarano nel file di interfaccia! • Diatriba tra property e iVar! 60
  • 61.
    Objective-C Dichiarare unaproperty @property(attributes) type name ;! ! • attributes: opzionale, indica attributi sulla property;! • type: tipo di dato della property! • name: nome che vogliamo assegnare 61
  • 62.
    Objective-C Property! •getter: definiamo come getter il metodo che ci restituisce il valore della property ! • setter: definiamo come setter il metodo che invochiamo per impostare il valore della property! • getter e setter: il compilatore definisce implicitamente i due metodi ! 62
  • 63.
    Objective-C Esempio getter! • - (tipo) propertyName ! ✓Es. [self age]! 63
  • 64.
    Objective-C Esempio setter! • - (void)setPropertyName:(tipo) propertyVal ! ✓ Es. [self setAge:42]! 64
  • 65.
    Objective-C Attributi diuna property! • getter = getterName: consente di personalizzare il nome del getter;! • setter = setterName: consente di personalizzare il nome del setter;! • readwrite: (default) indica che la property è di 65 lettura e scrittura
  • 66.
    Objective-C Attributi diuna property! • readonly: indica che una property è di sola lettura, mutuamente esclusivo con readwrite! • assign: (default) indica che è valorizzata come assegnazione di parametro e si usa solo con primitive (int, long, BOOL)! • retain: indica l’invocazione del retain sul parametro ricevuto nel setter, mutuamente esclusivo con assign e copy 66
  • 67.
    Objective-C Attributi diuna property! • copy: indica la creazione di una copia del parametro, mutuamente esclusivo con assign e retain! • nonatomic: specifica che non il parametro non è Thread Safe (concorrenza di accesso alla property)! • atomic: (default) indica che la property è Thread 67 Safe
  • 68.
    Objective-C Attributi diuna property! • strong: indica un riferimento forte al parametro, equivalente a retain! • weak: indica un riferimento debole al parametro, 68 equivalente ad assign
  • 69.
  • 70.
    Objective-C Property synthesize! • Di base il compilatore crea la variabile _propertyName per accedere alla property nell’implementazione (auto-synthesize)! • @synthesize: keyword che permette di rinominare la property nell’implementazione! • Es. ! ✓@synthesize _name = name 70
  • 71.
    Objective-C Ancora sullaproperty! • Può essere dichiarata all’interno di un Protocol! • In questo caso, la classe che implementa il protocollo ne deve definire getter e setter! • Utilizzo obbligatorio di @synthesize 71
  • 72.
  • 73.
    Objective-C Let’s Code! ✦Implementare una classe che contenga 3 properties di tipi differenti 73
  • 74.
    Objective-C ! Ulterioriapprofondimenti! Memory Management! Category! Protocol! Property! Good attributes explanation! 74
  • 75.