Programmazione iOS e Mac, Creazione di una classe

La creazione di una classe è composta da due fasi fondamentali:
1)l’allocazione
2) l’inizializzazione.

Es.

id mioCerchio=[Cerchio alloc];

Il metodo alloc alloca la memoria necessaria alle variabili istanza del nuovo oggetto inizializzandole a 0, le variabili BOOL vengono inizializzate a NO, gli int a 0, i float a 0.0, i puntatori a nil . Solo isa viene valorizzato.

Variabilie d’istanza ISA

Qualsiasi oggetto dispone della variabile istanza isa che restituisce la classe di appartenenza.
Isa è un puntatore ad una struttura dati inizializzata dal compilatore e disponibile dal runtime per reperire informazioni circa l’oggetto.

Solitamente un oggetto appena creato necessita anche di una fase di inizializzazione, e a tal scopo si ricorre al metodo init:

ES

id mioCerchi[Cerchio alloc]init];

L’inizializzazione prende la quantità di memoria allocata per l’oggetto e la predispone affinchè possa prendere vita nella maniera corretta.
Il metodo init ritorna sempre l’oggetto che è stato inizializzato, per cui è buona prassi concatenare la alloc e la init in un’unica istruzione .

Il metodo init può essere ridefinito in funzione delle esigenze contingenti alla nuova classe nel seguente modo:

[code lang=”objc”]

-(id) init {
<div>

if( self == [super init] )
{
// inizializzazione variabili istanza }
<pre> return self;
}

[/code]

Quando si definisce una nuova classe, si definiscono delle variabili d’istanza.
Ogni istanza della classe custodisce la propria ‘copia’ di variabili.L’object class non può accedere e manipolare in alcun modo le variabili di alcuna istanza creata.

Se si desidera condividere delle informazioni tra tutte le istanze create, occorre definire una (o più) variabile come static nel modulo implementazione della  Classe

Il Messaggi

I messaggi sono la tecnica usata in Objective-C per comunicare ad un oggetto che deve ‘attivare’ un particolare metodo

[riceviMetodo: argomento];

Un messaggio è sempre compreso tra due parentesi quadrate ‘[’ e ‘]’ che ne definiscono l’inizio e la fine.

Un oggetto può essere manipolato unicamente attraverso i suoi metodi, e i suoi metodi non possono essere confusi con quelli di un altro tipo di oggetto anche se i metodi di quest’ultimo presentano gli stessi nomi .

Questo vuol dire che due oggetti di tipo diverso si comporteranno in modo diverso a pari messaggio (questo è il poliformismo)

IL poliformismo

il polimorfismo indica l’attitudine di uno o più oggetti a mostrare implementazioni differenti per una singola funzionalità

Es

In questo caso il sistema è in grado di capire autonomamente quale figura geometrica debba essere disegnata ed invocarne direttamente il metodo disegnaFigura appartenente alla classe coinvolta

Il metodo esatto che viene invocato in risposta ad un messaggio può essere determinato solamente a runtime ,

Poichè ciascun oggetto può avere la sua implementazione di un dato metodo, un programma può ottenere risultati diversi semplicemente inviando lo stesso messaggio.

Il Selettore

I selettori sono delle variabili di tipo SEL a cui viene assegnata ,mediante la direttiva @selector ,il nome del metodo con gli eventuali parametri.

ES

SEL setDimXY;

setDimXY = selector(setDimX:andDimY:);

I suoi vantaggi sono evidenti a runtime nel caso in cui l’oggetto protagonista dell’azione sia determinabile solo durante l’esecuzione del programma .

L’uso di un selettore ci consente di affrontare la situazione in modo dinamico a runtime anche quando non sappiamo a priori il tipo di operazione coinvolta dall’oggetto

ES

id myObjRef = getTheReceiver();

SEL request = getTheSelector(); [myObjRef performSelector:request];

Confronto di Oggetti

Due oggetti soddisfano il criterio di identità se i loro identificatori puntano alla stessa istanza.
il confronto viene effettuato a codice nel seguente modo:

myOggA---->Metodo <-----MyOggB
if(myOggA==MyOggB)
{

   // puntano alla stessa istanza
}

Due oggetti soddisfano il criterio di eguaglianza se i riferimenti puntano ad oggetti diversi ma dello stesso tipo (stessa classe).

if ( [myObjA isEqual: myObjB] ) {

   // logicamente equivalenti
}