10
feb 2009


Corso interattivo di programmazione per iPhone: III Lezione

In questa lezione cominceremo a capire che cosa sono gli oggetti e come definirli con il linguaggio Objective-C 2.0. 

corsoiphoneitalia

Quello che comunque consiglio di fare e` di leggere il documento della Apple Objective-C 2.0 .

OGGETTI

Ci chiediamo:<<Come la definizione di un oggetto puo` aiutarmi a realizzare la mia prima applicazione “intelligente” per iPhone?>>. Gli oggetti sono la base di qualsiasi programma scritto in Objective-C (Quindi per Mac ed iPhone).

E quindi non ci rimane che chiederci: <<Che cos’e` un oggetto?>>

Pensate ad una macchina. La possiamo definire tramite le sue caratteristiche:

Modello, Casa, Cilindrata, Colore.

Il nostro oggetto Car ha quindi queste property (proprieta`). Per le persone a cui non piacciono i vocaboli in inglese dico subito che sara` necessario imparare un po` di termini tecnici in inglese, ma non temete, questo sara` naturale dopo un po`.

Ma il nostro oggetto macchina non e` fatto solo di proprieta`, bensi` anche di methods (metodi):

accendi_la_macchina

spegni_la_macchina

Essendo un oggetto d’esempio per ora consideriamo solo questi metodi. I metodi, molte volte, utilizzano le proprieta` (le variabili) dell’ oggetto.

 

CREAZIONE DI UN OGGETTO

Vediamo ora di passare un po` alla pratica. Prendiamo il nostro XCode e creiamo un progetto iPhone “Automobili”.

Una volta creato il progetto dovremo creare la nostra classe Car, la classe identifica il nostro oggetto Car.

picture-1

 Aprite il gruppo Classes, nel quale sono elencate le classi.

 

picture-2

 Premete il tasto destro Add-> New File

 

picture-3 

Il tipo di file che dovete selezionare e` NSObject subclass sotto Cocoa Touch Classes

 

picture-4 

 Chiamate questo file Car e lasciate l’ estensione “.m” .

 Lasciate selezionata l’ opzione “Also create Car.h” . Con questa opzione selezionata XCode creera` l’ interfaccia dell’ oggetto.

 

 

picture-5 Ecco il nostro oggetto Car nella lista delle classi.

 

 

CLASSI IN OBJ-C

Guardiamo che cosa c’e` scritto nel file Car.h (h sta per Header) che da ora in poi chiamero` interfaccia. La funzione di questo file e` quella di definire la struttura del nostro oggetto, lo scheletro. Nel file Car.m invece scriveremo l‘ implementazione, cioe` gli algoritmi.

INTERFACCIA

picture-11

Ecco la nostra interfaccia

 

picture-6

Con il comando #import si importa, in questo caso, la libreria Foundation. In Foundation ci sono molti oggetti utili che andremo ad utilizzare.

 

picture-7

Con “@interface Car” cominciamo a definire la nostra interfaccia Car.

 

picture-8

Dopo i “:” (due punti) possiamo specificare la nostra super class, la nostra classe padre. Una delle particolarita` degli oggetti e` quella di poter ereditare funzionalita` da altri oggetti. Il motivo per cui prima abbiamo selezionato NSObject subclass e` perche` il nostro oggetto e` una sottoclasse dell’ oggetto NSObject. NSObject e` un oggetto che fa parte della libreria Foundation. NSObject e` l’ oggetto generico secondo NextStep. Ora che sapete che la classe Car eredita le funzionalita` dell’ oggetto generico NSObject vi consiglio di andare a vedere nella documentazione: NSObject

picture-21Troverete tutta la lista dei metodi e la loro descrizione. I metodi ci permettono di agire su e con l’ oggetto.

 

 

DEFINIRE VARIABILI/OGGETTI E METODI DELLA CLASSE

L’ interfaccia di Car deve anche far capire agli altri programmatori che cosa fa il nostro oggetto. E` quindi bene dare dei nomi alle “cose” che abbiano senso.

picture-9

Tra le due parentesi graffe definiremo le variabili e gli oggetti che utilizza la nostra classe.

Tra la parentesi graffa chiusa e l’ “@end” definiremo i metodi della classe Car.

Per avere un’ infarinatura un po` piu` teorica vi consiglio di leggervi il pdf di Objective-C della Apple (che e` un MUST se volete capire realmente che cosa state facendo). Ora come ora sto cercando di tenere un’ approccio un po` “pratico” che dovrebbe invogliarvi a leggere il pdf da me consigliato.

 

VARIABILI

Ci sarebbe da scrivere un’ articolo intero sulle variabili, sulle differenze tra variabili ed oggetti, sul fatto che si utilizzano variabili per utilizzare gli oggetti etc..

Quindi quello che faro` sara` quello di redirigervi ad un sito dove vengono scritte in dettaglio le variabili in C

OGGETTI E PUNTATORI

Alcuni degli oggetti piu` utili che utilizzeremo sono:

NSString     : oggetto stringa (guardate la documentazione mi raccomando!)

NSNumber   : oggetto numero

NSArray    : array (vettore) di oggetti NSObject, il nostro oggetto Car eredita NSObject quindi possiamo metterlo all’ interno del vettore NSArray

…..

 

Quando vogliamo utilizzare un oggetto dobbiamo prima di tutto dichiarare il puntatore che ci permette di allocare lo spazio di memoria necessario per quell’ oggetto:

NSString *laMiaStringa;

In questo modo ho dichiarato il puntatore che mi permettera` di accedere alla zona di memoria dove ci sara` la stringa, ma per ora dentro la variabile “laMiaStringa” non c’e` proprio nulla.

 

Vediamo quindi un esempio pratico con il nostro oggetto Car

 

picture-31Il nostro oggetto ora ha uno stato, un nome ed un colore. Ci servono i metodi per accedere e manipolare queste informazioni.

picture-41

Il primo metodo “-(BOOL)isStarted;” ci dice se la nostra macchina e` accesa o no. Il meno “-” prima di “(BOOL)” ci dice che il nostro metodo e` un metodo non statico, vedremo in futuro che cosa significa. Con (BOOL) vogliamo dire che il nostro metodo restituisce un risultato tramite variabile BOOL, booleana o YES(1) o NO(0).

Il metodo “-(NSString*)name” ci restituira` il nome della macchina, mentre -(NSString*)color : il colore.

Come avrete capito i commenti (quelli in verde) sono molto importanti per annotare delle cose all’ interno del codice, anche per semplificare la vita agli altri programmatori. Per fare commenti bastera` aggiungere “//” prima del nostro commento.

Ora scrivo nell’ interfaccia i metodi che mi permettono di accendere e spegnere la macchina:

picture-51Ovviamente con la nostra interfaccia ora abbiamo solamente detto che il nostro oggetto IMPLEMENTA questi metodi, ma ora dobbiamo implementarli realmente!

 

Ora definiamo un metodo importantissimo “-init”

E` il metodo che ci permette di inizializzare il nostro oggetto con dei valori di default.

picture-32-initWithName:(NSString*)nomeMacchina    color:(NSString*)coloreMacchina;

Questo e` il modo di definire in objective-C un metodo con due argomenti. Questa definizione conincide con la funzione

initWithName_color(NSString* nomeMacchina, NSString *coloreMacchina);

Chi non ha basi di programmazione legga il pdf da me consigliato e per ora non consideri troppo tutte le varie casistiche. Dopo un po` di pratica certe cose non chiare cominceranno ad avere senso.

 

 

 

IMPLEMENTAZIONE

Andiamo in Car.m, in questo file implementeremo i nostri, semplici, metodi.

picture-13

Come prima cosa copiatevi tutta la lista dei metodi definiti nell’ interfaccia

picture-14

Implementiamo come prima cosa il costruttore. Il costruttore ci permette di inizializzare il nostro oggetto impostando due valori, il nome ed il colore della macchina. Facciamo anche in modo che la macchina sia spenta una volta che l’ oggetto e` inizializzato.

 

 

picture-23

le variabili name, color e status sono quelle dell’ oggetto Car. I valori che vengono impostati sono nomeMacchina, coloreMacchina e NO.

Essendo status=NO all’ inizio la nostra macchina sara` spenta.

Alla fine c’e` un “return self;” per ora scrivetelo senza farvi troppe domande.

 

-(BOOL)isStarted;

Questo metodo ci dice se la macchina e` accesa o no. La variabile nella quale e` memorizzato lo stato della macchina e` status

picture-33

In questo modo restituiamo il valore contenuto all’ interno della variabile status rispondendo YES se la macchina e` accesa, NO nel caso sia spenta.

 

picture-42In questo modo restituiamo i valori name e color.

 

picture-52

Per accendere e spegnere la nostra macchina andiamo a modificare unicamente il valore di status.

 

 

PROVIAMO A COMPILARE

picture-61

Facciamo build per vedere se il codice che abbiamo scritto “compila” (non ha errori di struttura).

 

picture-15

In basso a destra vedremo la scritta “Succeeded”, significa che la compilazione e` andata a buon fine. Ora abbiamo scritto il nostro oggetto e possiamo utilizzarlo.

 

 

UTILIZZIAMO IL NOSTRO OGGETTO

 

Per utilizzare subito il nostro oggetto senza per ora considerare l’ aspetto grafico andiamo all’ interno dell’ implementazione della classe AutomobiliAppDelegate (File AutomobiliAppDelegate.m) e andiamo all’ interno del metodo

 

- (void)applicationDidFinishLaunching:(UIApplication *)application;

Tutto quello che scriveremo all’ interno di questo metodo verra` eseguito all’ inizio dell’ esecuzione della nostra applicazione. 

Per stampare a Console delle scritte possiamo utilizzare la funzione NSLog.

Vi spiego prima di tutto come funziona la funzione NSLog. 

“ciao come va”  -> Stringa char*

@”ciao come va” -> oggetto NSString

NSLog vuole come primo argomento un oggetto NSString

NSLog(@”Hello World”);    -> produrra` un output “Hello World”

Se vogliamo stampare delle variabili a schermo dobbiamo specificare all’ interno della stringa il tipo di variabile e poi dobbiamo specificare la nostra variabile in questo modo:

BOOL status = YES;

NSLog(@”valore della variabile status = %d”,status); 

1 = YES, 0 = NO.

Fate questa prova:

picture-34

picture-44Poi fate “Build and Go” per avviare l’ applicazione

 

A questo punto sull’ iphone simulator non comparira` nulla, ma NSLog stampa i risultati sulla console. Per visualizzare la console fate Run -> Console

picture-53

A questo punto vi comparira` la console

 

picture-62

Come vedete il valore che viene stampato a schermo e` “1″.

 

NSLog

Vi scrivo un po` di esempi pratici

 

picture-71

Output:

picture-81

Il %@ serve per inserire una stringa. Vedete che al posto del primo %@ viene inserita la prima stringa “NSString *stringa1″ ed al secondo %@ la seconda stringa.

Il simbolo “\n” si chiama newline e permette di andare a capo.

Ora provo a sostutuire stringa1 con stringa2

 

picture-91Output:

 

picture-10

 

Ora invece inserisco anche dei numeri

 

picture-111

Output:

picture-121

 

UTILIZZO DEGLI OGGETTI E DEI METODI

Ora che sapete utilizzare, spero, NSLog possiamo vedere come utilizzare il nostro oggetto Car.

Un oggetto prima di esser utilizzato va inizializzato. Prima di esser inizializzato va allocato. La procedura di alloc serve per richiedere la memoria necessaria all’ oggetto.

Per utilizzare un metodo di un oggetto bisogna fare in questo modo

[oggetto    metodo];

Esempio:

picture-141

 

Output:

 

picture-151

Come vedete l’ utilizzo del metodo “uppercaseString” dell’ oggetto NSString ha prodotto una stringa tutta in maiuscolo. Vi STRAconsiglio di andare a leggere la documentazione dell’ oggetto NSString, troverete anche il metodo “uppercaseString”

picture-131Come vedete il metodo uppercaseString ritorna la stringa in maiuscolo.

 

Proviamo ora ad utilizzare il nostro oggetto Car:

Prima di tutto dobbiamo importare la nostra interfaccia in questo modo

picture-17

Abbiamo aggiunto la stringa

#import “Car.h”

alla lista degli import. In questo modo il compilatore sa che quando utilizziamo la scritta Car, stiamo parlando del nostro oggetto Car.

Sappiamo che come prima cosa il nostro oggetto va allocato e poi inizializzato.

picture-19

Car *ferrari = [[Car alloc] initWithName:@”Ferrari” color:@”Rosso”];

[Car alloc]  alloca la memoria e quindi [Car alloc] e` un oggetto Car allocato ma non inizializzato

iniWithName:(NSString*)   color:(NSString*)        inizializza l’ oggetto.

 

Ora il nostro oggetto Car *ferrari e` una macchina Ferrari di colore rosso spenta.

picture-211Output:

picture-20

 

Accendiamo la macchina

picture-221Output:

picture-231

Come vediamo dall’ output dopo aver chiamato il metodo “accendi” dell’ oggetto Car lo stato della macchina e` cambiato da 0 (NO) a 1 (YES).

Come avrete capito, ho cercato di spiegarvi velocemente e tramite esempi l’ inizio della programmazione ad oggetti con Objective-C. Vi consiglio CALDAMENTE di leggere il pdf della apple.

Nella prossima lezione introdurro` i loop: while, for

I controlli : if , else if, else, switch

Intanto studiate un po` quello che ho scritto ed il PDF!! Fate un po` di prove e consultate la documentazione! 

 

Ho messo anche questa volta online il codice del progetto:   Automobili.zip

internettranslatorbanner


Alvise Susmel (10 febbraio 2009 8:00)

L'utilizzo del contenuto di questo articolo è soggetto alle condizioni della Licenza Creative Commons. Sono consentite la distribuzione, la riproduzione e la realizzazione di opere derivate per fini non commerciali, purchè venga citata la fonte.
  • Giulio

    Grazie di cuore!!!

  • Casta

    Scusate se forse anticipo un po il corso, ma i metodi da voi creati nn sarebbero da creare non statici?

  • Raffaele Pio Argo

    grazie come sempre!

  • http://www.gecosoftware.com Alvise

    @Casta: si hai ragione ho scritto “statici” invece che “non statici”. Ho corretto, grazie.

  • Mx

    Ciao a tutti,
    è un po che seguo questo corso, per ora solo leggendolo e mi sembra buono l’avvio. Devo trovare qualche oretta per mettere in pratica la teoria.
    Quello che trovo strano assurdo è che per capire qualcosa su Objective C di Apple ci sia disponibile solo un documento e peraltro solo in lingua inglese.
    Se devo comprendere/apprendere qualcosa di nuovo è oltremodo ovvio che dovrò farlo nella mia lingua madre! A parte la traduzione di “Become an X Coder” che si trova su XCode Italia, esiste qualcos’altro in italiano?
    Grazie a tutti per la gentile attenzione.

    Saluti.

  • Casta

    @Alvise
    Di niente, figurati =)

  • http://www.melive.org Muccy

    Ciao a tutti.

    Un consiglio da sviluppatore…
    Vi sareste dimenticati i retain sugli argomenti della classe Car.

    Infatti se si facesse…
    NSString *aName = @”Ferrari”;
    Car *aCar = [[Car alloc] initWithName:aName andColor:@”Rossa”];
    [aName release];
    [aCar name]; //<– dangling reference!!!

    A questo problema si può ovviare usando i metodi accessor automatici, oppure più semplicemente nel metodo initWithName:andColor: usare
    name = [theName retain];
    color = [theColor retain];

    Ed fare overriding del metodo NSObject chiamato dealloc…quindi…
    - (void)dealloc {
    [name release];
    [color release];
    [super dealloc];
    }

  • http://www.gecosoftware.com Alvise

    @Muccy : Come avrai notato non ho ancora trattato la gestione della memoria. Questo proprio per non mettere troppa carne al fuoco e confondere i lettori

  • http://www.melive.org Muccy

    Sì avevo capito ma non sono d’accordo.
    Nel senso… visto che questo è un aspetto critico della programmazione su iPhone (praticamente l’unico, non so se concordi =) ) forse era il caso davvero di dirlo.

    Cmq bel corso =) non era una critica…solo un suggerimento!

    Ciao! =)

  • http://www.gecosoftware.com Alvise Susmel

    @Mucchy: non e` che non citero` la questione retain/release. Semplicemente dedichero` una lezione solo per la gestione della memoria.
    Grazie cmq del consiglio.

  • Andrea

    ciao, qualcuno sa dirmi se SDK 2.2.1 oltre che su intel può funzionare (anche magari più lentamente) anche su powerpc?

  • http://www.gecosoftware.com Alvise Susmel

    @Andrea: ufficialmente no, con un trucchetto si`:

    http://forums.ilounge.com/showthread.php?t=223546

  • Andrea

    grazie mille ora provo subito

  • TOM

    Le lezioni sono molto belle ed utili, se magari si accelerassero un pò le loro pubblicazione :D

  • yeah

    grazie!!!!

  • matteo

    ciao a tutti, io sono alle primissime armi con objective c e vorrei comprender meglio una cosa.
    Mettiamo che io abbia creato come nell’esempio la mia bella ferrari con il codice:

    Car *ferrari = [[Car alloc] initWithName:@”Ferrari” color:@”Rosso”];

    io ora vorrei da una classe A riuscire ad avere i valori dei campi name e color della mia istanza di Car (nell’ esempio di “ferrari”), come si fa?!

    giuro che son 3 giorni che ci provo ma non riesco proprio a recuperare quei dati, non so se sbaglio nel richiamare l’istanza o che ma sta di fatto che non mi viene restituito niente..

    spero possiate rispondermi per aiutarmi a capire.
    Ciao e continuate così che siete utilissimii!..:)

  • Michele++

    Certo che sviluppare in Objective C è piu tedioso di quanto sembri!!
    Solo La Apple poteva fare ste porcate!
    leggere codice del genere:
    Car *ferrari = [[Car alloc] initWithName:@”Ferrari” color:@”Rosso”];
    fa veramente schifo!

    Questi della Apple non potevano utilizzare C++? Mah

    Cmq alidà di questo complimenti per il corso.

    Saluti

  • 4l3

    Ho seguito tutto quello detto, ma mi dice che ci sono 7 errori di “scrittura”…mi aiutate???

  • Anthony

    Potete rifornirmi un link con il codice, perchè quello presente mi da errore! grazie!


Follow iPhoneItalia.com on Twitter



  • iPhone 5, come lo vorresti?

    Risultati

    Loading ... Loading ...

Home | Pubblicità | About | Privacy | Contact | Feed RSS | iPhone View