2. AGENDA
Il linguaggio
Xcode
Classi e Oggetti
Creare oggetti
Propriet degli oggetti
Gestione (base) della memoria
Init e dealloc
3. IL LINGUAGGIO (1)
Objective-C 竪 il principale linguaggio di programmazione
che si utilizza per creare applicazioni per OSX.
E' la base da apprendere per utilizzare le librerie
(framework) che Apple mette a disposizione e che
consentono lo sviluppo di applicazioni su:
OSX
iPhone
iPodTouch
4. IL LINGUAGGIO (2)
E' un linguaggio di programmazione ad oggetti
(paradigma OOP) con caratteristiche che lo rendono
simile sia a linguaggi come Java e C++.
Lasceremo (quasi) da parte la teoria della OOP e ci
soffermeremo pi湛 sul lato "pratico". Lo scopo infatti 竪
quello di dare degli strumento immediati per lo sviluppo.
5. XCODE (1)
Per "tradurre" il nostro programma in un linguaggio
comprensibile al computer abbiamo bisogno di un
compilatore. Il suo utilizzo avviene principalmente
attraverso due modi:
1) Invocazione manuale della compilazione (es. tramite
terminale)
2) Utilizzo di un ambiente di sviluppo integrato (IDE): nel
nostro caso Xcode
6. XCODE (2)
Xcode 竪 quindi l'IDE di riferimento per lo sviluppo su
OSX. Utilizzeremo questo strumento perch辿:
E' di facile utilizzo
Le principali azioni sono a portata di click
Ci avverte di eventuali errori presenti nel codice
Mette a disposizione un elenco di template adatti al
tipo di applicazioni che andremo a sviluppare
8. CLASSI E OGGETTI (1)
Cosa sono?
"Think of an object as a fancy variable; it stores data, but
you can "make requests" to that object, asking it to do
operation on itself."
Bruce Eckel, Thinking in Java
Sono un'astrazione che ci permette di mappare oggetti
reali (o immaginari) in oggetti software. Cos狸 come nel
mondo reale, anche in OOP tutto 竪 un oggetto... o quasi!
9. CLASSI E OGGETTI (2)
I nostri programmi quindi saranno un insieme di oggetti
che dialogano tra loro inviandosi messaggi e ricevendo
risposte.
Ogni oggetto appartiene ad una classe...
10. CLASSI E OGGETTI (3)
Una breve, ma importante distinzione:
Classe: 竪 una descrizione astratta, un prototipo, che
de鍖nisce il comportamento di un oggetto.
Oggetto: 竪 un'entit, appartenente ad una classe, con
un proprio stato e comportamento.
11. CLASSI E OGGETTI (4)
Durante lo sviluppo di un programma quindi, saremo soliti
de鍖nire una classe ed istanziare uno o pi湛 oggetti relativi
ad essa.
classe
oggetti
12. CREARE OGGETTI (1)
In Objective-C per de鍖nire un oggetto, quindi la classe cui
esso appartiene, abbiamo bisogno di due 鍖le:
uno (.h) che de鍖nisce l'interfaccia della classe
l'altro (.m) che ne de鍖nisce l'implementazione
L'interfaccia descrive le azioni (i metodi) della classe e
nasconde l'implementazione che de鍖nisce come i metodi
vengono realmente eseguiti.
Gli oggetti comunicano tramite le loro interfacce!
13. CREARE OGGETTI (2)
De鍖nizione di un'interfaccia (MyClass.h)
@interface MyClass : NSObject {
dichiarazione di interfaccia classe di appartenenza
nome della classe - int variabile; variabili di classe
} metodi (azioni) esposti
- (void)eseguiMetodo;
@end
14. CREARE OGGETTI (3)
L'implementazione (MyClass.m)
#import "MyClass.h" interfaccia da implementare
@implementation MyClass
implementazione della classe
- (void)eseguiMetodo {
// esegui qualcosa...
implementazione dei metodi
}
@end
15. CREARE OGGETTI (4)
Struttura di un metodo:
- (void) eseguiMetodo;
tipologia di metodo tipo di ritorno nome del metodo
Un metodo pu嘆 avere uno o pi湛 argomenti:
- (int) sommaNumero:(int)arg1 conNumero:(int)arg2;
tipo argomento nome argomento
16. PROPRIETA' (1)
Per permettere che le propriet (variabili) di una classe
possano essere lette e/o modi鍖cate da chi la utilizza,
dobbiamo fornire dei metodi speci鍖ci (getter/setter).
Objective-C pu嘆 generare automaticamente questi
metodi attraverso l'utilizzo delle keyword @properties e
@synthesize.
17. PROPRIETA' (2)
Nell'interfaccia dichiariamo per quali variabili vogliamo
creare i getter/setter
@interface MyClass : NSObject {
- int variabile;
}
@properties (retain) int variabile;
- (void)eseguiMetodo;
@end
19. GESTIONE MEMORIA (1)
La creazione di un oggetto implica l'occupazione di
memoria che successivamente dovr essere liberata.
Possiamo riassumere il ciclo di vita di un oggetto nel
seguente modo:
alloc init use dealloc
20. GESTIONE MEMORIA (2)
alloc: viene allocata (predisposta) la memoria necessaria
ad ospitare l'oggetto.
init: viene inizializzato l'oggetto invocando il suo
costruttore, l'oggetto "prende vita".
use: utilizzo dell'oggetto.
dealloc: rimozione dalla memoria.
21. GESTIONE MEMORIA (3)
La gestione del ciclo di vita di un oggetto, si basa
sull'utilizzo di un "contatore" che tiene traccia di quanti
oggetti (esterni) hanno un riferimento ad esso.
Ogni volta che si crea un riferimento ad un oggetto il suo
contatore si incrementa, quando viene rimosso si
decrementa. Se il contatore raggiunge lo zero l'oggetto
viene rimosso dalla memoria.
Questo meccanismo 竪 noto come retain/release
24. GESTIONE MEMORIA (6)
E' importante ricordare che ad ogni retain (necessit di
conservare un riferimento ad un oggetto) deve
corrispondere un release (rilascio dell'oggetto).
L'inizializzazione di un oggetto corrisponde ad un retain.
Se non si segue questa regola si pu嘆 avere un problema
detto di "memory leak": spazio di memoria utilizzato ma
che non possiamo liberare.
25. INIT E DEALLOC (1)
La creazione di un oggetto avviene attraverso
l'invocazione di un particolare metodo chiamato
costruttore. Non 竪 necessario implementare questo
metodo in quanto ogni oggetto ha un costruttore di
default de鍖nito implicitamente.
MyClass *foo = [[MyClass alloc] init];
costruttore di default
26. INIT E DEALLOC (2)
Possiamo, per嘆, avere la necessit di eseguire determinate
azioni al momento della creazione di un oggetto. In
questo caso possiamo ride鍖nire il metodo init (override
di init) adattandolo alle nostre esigenze.
@implementation MyClass
- (id)init {
if(self = [super init]) {
variabile = 1;// valorizzo la var
}
return self;
}
27. INIT E DEALLOC (3)
Analogamente al costruttore, possiamo ride鍖nire le azioni
al termine del ciclo di vita di un oggetto facendo
l'override del metodo dealloc.
@implementation MyClass
- (void)dealloc {
NSLog(@"Override di dealloc...bye!");
[super dealloc];
}