Guida XCODE Funzione main e gestione della memoria sviluppo applicazioni
Pagina 1 di 1
Guida XCODE Funzione main e gestione della memoria sviluppo applicazioni
All'interno della cartella Other sources è presente il file main.m.
Come in una qualsiasi applicazione C-based, il punto di ingresso di
un'applicazione iOS al momento del lancio dell'applicazione è proprio la
funzione main.
L'implementazione di questa funzione main è minimale e, nella
realizzazione delle vostre applicazioni, non avrete alcuna necessità di
modificare questa funzione.
Andiamo adesso ad analizzare il codice contenuto all'interno della funzione main:
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
Come possiamo vedere, la prima operazione che viene eseguita è quella di istanziare un oggetto di tipo Autorelease Pool. Un oggetto di questo tipo rappresenta il gestore della memoria relativo alla nostra applicazione. Su i dispositivi iOS non è presente nessun tipo di Garbage Collection
in quanto la memoria dei dispositivi è molto limitata e quindi è
necessario l'utilizzo di un gestore di memoria (Autorelease Pool) molto
più complesso rispetto al Garbage Collection.
Lo scopo dell'Autorelease Pool è quello di evitare che oggetti "inutili"
siano mantenuti in memoria e che quindi venga occupato dello spazio
prezioso per risorse che magari non sono più necessarie per il corretto
svolgimento dell'applicazione.
Ma come fa l'Autorelease Pool a capire se un oggetto è utile o
inutile? Per svolgere i suoi compiti Autorelease Pool sfrutta una
proprietà che tutti gli oggetti hanno in Objective C ovvero il retainCount che rappresenta ciò che precedentemente avevamo identificato come il contatore di riferimenti per quell'oggetto.
Quando il contatore di un oggetto raggiunge valore zero, viene
automaticamente eliminato dalla memoria dall'Autorealease Pool e dunque
gli oggetti che riteniamo necessari per la corretta esecuzione
dell'applicazione dovranno mantenere sempre un retainCount maggiore o
uguale a 1.
La gestione della memoria eseguita in maniera efficiente è un punto
cruciale quando si sviluppa per dispositive mobile o dispositivi in cui
si hanno delle risorse limitate.
Negli esempi precedenti abbiamo visto che per ogni attributo della classe (che è un oggetto) veniva effettuato il release nel metodo dealloc della classe.
Può capitare, però, all'interno di un metodo, di dover dichiarare alcuni
oggetti per poter espletare la funzione richiesta al metodo stesso. In
questo caso il release di questi oggetti non deve essere
inserito nel dealloc (perchè il dealloc lavora esclusivamente sugli
attributi della classe), il release per l'oggetto deve essere, dunque, inserito nel metodo stesso e deve essere effettuato quando l'oggetto non è più necessario.
Ovviamente bisogna prestare attenzione al punto del codice in cui inserire il release dell'oggetto,
perchè se per esempio allocate ed inizializzate un oggetto, fate il
release e poi lo passate come argomento ad un altro metodo,
l'applicazione andrà ovviamente in crash.
In questo paragrafo abbiamo spiegato solo i concetti principali della
gestione della memoria, se si vuole approfondire l'argomento si
consiglia di leggere la documentazione Apple.
Proseguendo nella nostra analisi del codice, troviamo la chiamata alla funzione UIApplicationMain
che è una funzione importantissima in quanto ha il compito di
inizializzare la nostra applicazione con i quattro parametri di sistema
che gli vengono passati come argomento.
Oggetto Delegate
Nella lezione precedente, durante l'analisi di un'applicazione window-based, abbiamo incontrato il termine appDelegate. Ma che cosa è questo appDelegate?
Sostanzialmente, il delegate (o delegato)
rappresenta un pattern di programmazione nel quale viene delegato, ad
una determinata classe, il comportamento ad alto livello.
Utilizzeremo il delegate quando sarà presente un controller
(vedremo più avanti di cui si tratta) che rileva, per esempio, un cambio
di stato dell'applicazione per poi segnalarlo al delegate stesso il
quale compierà una determinata operazione.
L'oggetto delegate gestisce anche i vari messaggi critici di sistema e
deve essere presente in ogni applicazione iOS. In applicazioni di
grosse dimensioni avere un delegate per ogni modulo significativo
consente di mantenere il codice ordinato e poterne fare manutenzione in
maniera semplice ed intuitiva.
Come in una qualsiasi applicazione C-based, il punto di ingresso di
un'applicazione iOS al momento del lancio dell'applicazione è proprio la
funzione main.
L'implementazione di questa funzione main è minimale e, nella
realizzazione delle vostre applicazioni, non avrete alcuna necessità di
modificare questa funzione.
Andiamo adesso ad analizzare il codice contenuto all'interno della funzione main:
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
Come possiamo vedere, la prima operazione che viene eseguita è quella di istanziare un oggetto di tipo Autorelease Pool. Un oggetto di questo tipo rappresenta il gestore della memoria relativo alla nostra applicazione. Su i dispositivi iOS non è presente nessun tipo di Garbage Collection
in quanto la memoria dei dispositivi è molto limitata e quindi è
necessario l'utilizzo di un gestore di memoria (Autorelease Pool) molto
più complesso rispetto al Garbage Collection.
Lo scopo dell'Autorelease Pool è quello di evitare che oggetti "inutili"
siano mantenuti in memoria e che quindi venga occupato dello spazio
prezioso per risorse che magari non sono più necessarie per il corretto
svolgimento dell'applicazione.
Ma come fa l'Autorelease Pool a capire se un oggetto è utile o
inutile? Per svolgere i suoi compiti Autorelease Pool sfrutta una
proprietà che tutti gli oggetti hanno in Objective C ovvero il retainCount che rappresenta ciò che precedentemente avevamo identificato come il contatore di riferimenti per quell'oggetto.
Quando il contatore di un oggetto raggiunge valore zero, viene
automaticamente eliminato dalla memoria dall'Autorealease Pool e dunque
gli oggetti che riteniamo necessari per la corretta esecuzione
dell'applicazione dovranno mantenere sempre un retainCount maggiore o
uguale a 1.
La gestione della memoria eseguita in maniera efficiente è un punto
cruciale quando si sviluppa per dispositive mobile o dispositivi in cui
si hanno delle risorse limitate.
Negli esempi precedenti abbiamo visto che per ogni attributo della classe (che è un oggetto) veniva effettuato il release nel metodo dealloc della classe.
Può capitare, però, all'interno di un metodo, di dover dichiarare alcuni
oggetti per poter espletare la funzione richiesta al metodo stesso. In
questo caso il release di questi oggetti non deve essere
inserito nel dealloc (perchè il dealloc lavora esclusivamente sugli
attributi della classe), il release per l'oggetto deve essere, dunque, inserito nel metodo stesso e deve essere effettuato quando l'oggetto non è più necessario.
Ovviamente bisogna prestare attenzione al punto del codice in cui inserire il release dell'oggetto,
perchè se per esempio allocate ed inizializzate un oggetto, fate il
release e poi lo passate come argomento ad un altro metodo,
l'applicazione andrà ovviamente in crash.
In questo paragrafo abbiamo spiegato solo i concetti principali della
gestione della memoria, se si vuole approfondire l'argomento si
consiglia di leggere la documentazione Apple.
Proseguendo nella nostra analisi del codice, troviamo la chiamata alla funzione UIApplicationMain
che è una funzione importantissima in quanto ha il compito di
inizializzare la nostra applicazione con i quattro parametri di sistema
che gli vengono passati come argomento.
Oggetto Delegate
Nella lezione precedente, durante l'analisi di un'applicazione window-based, abbiamo incontrato il termine appDelegate. Ma che cosa è questo appDelegate?
Sostanzialmente, il delegate (o delegato)
rappresenta un pattern di programmazione nel quale viene delegato, ad
una determinata classe, il comportamento ad alto livello.
Utilizzeremo il delegate quando sarà presente un controller
(vedremo più avanti di cui si tratta) che rileva, per esempio, un cambio
di stato dell'applicazione per poi segnalarlo al delegate stesso il
quale compierà una determinata operazione.
L'oggetto delegate gestisce anche i vari messaggi critici di sistema e
deve essere presente in ogni applicazione iOS. In applicazioni di
grosse dimensioni avere un delegate per ogni modulo significativo
consente di mantenere il codice ordinato e poterne fare manutenzione in
maniera semplice ed intuitiva.
andre- Admin
- Messaggi : 1791
Wrong Points : 2514
Reputazione : 7
Data d'iscrizione : 06.12.10
Età : 31
Personaggio GDR
Nome del personaggio: Zeod
Livello: 1
Esperienza:
(6/100)
Argomenti simili
» Guida XCODE introduzione sviluppare applicazioni iPhone iPad Mac
» Guida XCODE Applicazione window-based: analisi del codice
» Guida XCODE utilizzo di View-based application e ViewController
» Guida XCODE Creare una vista (view) utilizzando il codice
» Imparare ad usare X-Code con una guida e video ed a sviluppare applicazioni iPhone e iPad
» Guida XCODE Applicazione window-based: analisi del codice
» Guida XCODE utilizzo di View-based application e ViewController
» Guida XCODE Creare una vista (view) utilizzando il codice
» Imparare ad usare X-Code con una guida e video ed a sviluppare applicazioni iPhone e iPad
Pagina 1 di 1
Permessi in questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum.
Sab Set 04, 2021 10:40 pm Da rondani2003
» la mia vita
Gio Lug 31, 2014 12:17 pm Da lindaluigiangelo
» Ciao a tutti
Dom Ott 13, 2013 9:30 am Da Primahs
» Ciao a todos
Lun Set 16, 2013 6:39 pm Da Primahs
» ciao ciao a tutti
Lun Set 16, 2013 6:38 pm Da Primahs
» YoEveryone
Ven Set 13, 2013 3:22 pm Da Primahs
» ciao a tutti
Sab Ago 31, 2013 11:44 am Da Primahs
» Ciao a tutti
Sab Ago 31, 2013 11:44 am Da Primahs
» salve a tutti !!
Sab Ago 31, 2013 11:43 am Da Primahs