際際滷

際際滷Share a Scribd company logo
Intro
AGENDA
 Il linguaggio
 Xcode
 Classi e Oggetti
 Creare oggetti
 Propriet degli oggetti
 Gestione (base) della memoria
 Init e dealloc
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
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.
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
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
XCODE (3)
http://developer.apple.com/technology/Xcode.html
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!
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...
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.
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
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!
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
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
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
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.
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
PROPRIETA' (3)
Nell'implementazione esplicitiamo la creazione
automatica dei metodi.
              #import "MyClass.h"

              @implementation MyClass

              @synthesize variabile;

              - (void)eseguiMetodo {
                // esegui qualcosa...
              }

              @end
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
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.
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
GESTIONE MEMORIA (4)
         retain = 0


                      +1   MyClass *foo = [[MyClass alloc] init];

         retain = 1        ...
time




                      -1   [foo release];

         retain = 0




          dealloc
GESTIONE MEMORIA (5)
       retain = 0

              +1                              MyClass *foo = [[MyClass alloc] init];

             retain = 1

                                              [foo retain];
time




                    +1


                    retain = 2

                            -1                [foo release];

                          retain = 1

                                  -1          [foo release];

                                 retain = 0
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.
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
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;
            }
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];
           }
alla prossima...

More Related Content

[Objective-C] - Introduzione

  • 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
  • 18. PROPRIETA' (3) Nell'implementazione esplicitiamo la creazione automatica dei metodi. #import "MyClass.h" @implementation MyClass @synthesize variabile; - (void)eseguiMetodo { // esegui qualcosa... } @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
  • 22. GESTIONE MEMORIA (4) retain = 0 +1 MyClass *foo = [[MyClass alloc] init]; retain = 1 ... time -1 [foo release]; retain = 0 dealloc
  • 23. GESTIONE MEMORIA (5) retain = 0 +1 MyClass *foo = [[MyClass alloc] init]; retain = 1 [foo retain]; time +1 retain = 2 -1 [foo release]; retain = 1 -1 [foo release]; retain = 0
  • 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]; }