Obiettivo-C in breve Hello Objective-C

Questo capitolo è progettato per aiutarti ad ambientarti nello stile di programmazione Objective-C. Alla fine di questo capitolo, sarete in grado di istanziare oggetti, creare e chiamare metodi e dichiarare proprietà. Ricorda che l'obiettivo è quello di fornire una breve panoramica dei principali aspetti orientati agli oggetti di Objective-C, non una descrizione dettagliata di ciascun componente. I capitoli successivi completano molti dei dettagli concettuali omessi da questo capitolo.


Creare una classe

Esempio di codice incluso: HelloObjectiveC With Class

Immergiti subito e crea un nuovo file Objective-C. Nell'IDE Xcode, vai a File > Nuovo > File… o usare il Cmd + N collegamento per aggiungere un file al progetto. La prossima finestra di dialogo ti consente di selezionare il tipo di file che desideri creare. Sotto il Cocoa Touch categoria, selezionare Classe Objective-C.

L'icona della classe Objective-C

Ti viene data l'opportunità di specificare un nome per la tua nuova classe. Chiamiamo la nostra classe Persona. Per la classe genitore, usa NSObject, che è l'oggetto di livello superiore da cui ereditano tutte le classi Objective-C.

Definire una nuova classe Person

Facendo clic Il prossimo aprirà un browser di file e ti chiederà di inserire un Gruppo per la tua classe, così come a Bersaglio. Usa il valore predefinito Gruppo, quale dovrebbe essere HelloObjectiveC. I gruppi sono un meccanismo specifico per Xcode per il raggruppamento di file simili, ma essi non sono implementato a livello di file. La nostra nuova classe apparirà nella stessa cartella del resto dei file di progetto, indipendentemente dal gruppo in cui si trova. Per obiettivi, assicurarsi HelloObjectiveC è selezionato. Ciò garantisce che la nuova classe venga compilata ogni volta che viene creato il target HelloObjectiveC.

Selezione degli obiettivi di compilazione per la nuova classe

Infine, fai clic Creare per creare la classe. Nel navigatore di file Xcode, ora dovresti trovare due nuove classi: Person.h e Person.m. Proprio come il linguaggio di programmazione C, Objective-C utilizza .h come estensione per i file header, che contengono l'interfaccia per una particolare funzione o classe, questo non deve essere confuso con un'interfaccia C #, che è chiamata protocollo in Objective-C. Il .m file è l'implementazione corrispondente per il Persona classe.

Separando un'interfaccia di classe dalla sua implementazione è possibile nascondere i dettagli di implementazione da oggetti di terze parti. Altri file che devono interagire con la classe importano il intestazione file-mai il implementazione file. Ciò fornisce la definizione astratta necessaria per chiamare metodi e proprietà di accesso pur essendo completamente indipendente dall'implementazione della classe.


Componenti di una classe

Nel navigatore del progetto, selezionare Person.h per aprirlo nel pannello dell'editor. Dovresti vedere il seguente codice Objective-C:

#importare  @interface Person: NSObject @end

Il #importare direttiva include un altro file nel contesto corrente. Includere un file di intestazione ci dà accesso a tutte le classi e funzioni che definisce. In questo caso, abbiamo incluso la struttura della Fondazione. Il framework Foundation definisce i costrutti di base del linguaggio Objective-C - cose come stringhe, array, dizionari, ecc. - quindi è una parte necessaria di praticamente ogni programma Objective-C.

Il @interfaccia direttiva inizia un'interfaccia per una classe. Segue il nome della classe, Persona, seguito da due punti e dalla classe genitore, NSObject. Come notato in precedenza, NSObject è l'oggetto di livello superiore in Objective-C. Contiene i metodi necessari per creare e distruggere istanze, insieme ad altre utili funzionalità condivise da tutti gli oggetti.

Qualsiasi metodo o proprietà sarebbe dichiarato prima del @fine direttiva, ma in questo momento, Person.h è un'interfaccia vuota Lo cambieremo tra un minuto, ma prima diamo una rapida occhiata al file di implementazione, Person.m:

#import "Person.h" @implementation Person @end

Questo assomiglia molto al file di intestazione, ma include il Person.h intestazione. File di implementazione dovere includere la loro intestazione associata, altrimenti non saranno in grado di trovare la classe che stanno cercando di implementare.

Notare anche questo #importare la direttiva usa virgolette anziché parentesi angolate. Le virgolette devono essere utilizzate per importare Locale intestazioni, mentre le parentesi indicano globale intestazioni. Le intestazioni globali risiedono all'esterno del progetto e sono collegate al compilatore durante il processo di compilazione. I framework standard di Apple sono sempre inclusi in parentesi angolate, mentre i file di progetto devono essere importati con virgolette.

E, naturalmente, il .m il file usa il @implementazione direttiva invece di @interfaccia. Nota che tu non devi specificare la classe genitore qui, poiché questa informazione è già contenuta nell'intestazione.


Definizione dei metodi

Successivamente, aggiungeremo una dichiarazione di metodo a Persona classe. Ricorda che questo è un processo in due fasi: prima dobbiamo aggiungerlo all'interfaccia e quindi all'implementazione. Quindi, cambia Person.h al seguente:

#importare  @interface Person: NSObject - (void) sayHello; @fine

Come puoi vedere, i metodi di istanza sono dichiarati con un trattino, il tipo restituito tra parentesi (vuoto), seguito dal nome del metodo e da un punto e virgola. Ora che ce l'abbiamo nell'interfaccia, passiamo a Person.m per definire l'implementazione. Nota che Xcode ha aggiunto un piccolo triangolo giallo accanto al @implementazione linea. Se fai clic su di esso, troverai un messaggio di avviso che dice Implementazione incompleta. Questa è una delle numerose funzionalità di debug di Xcode. Risolviamo il problema cambiando Person.m al seguente:

#import "Person.h" @implementation Person - (void) sayHello NSLog (@ "Ciao, il mio nome è HAL.");  @fine

Come la dichiarazione dell'interfaccia, l'implementazione per un metodo di istanza inizia con un trattino, il tipo restituito e il nome della funzione. L'implementazione stessa è definita nelle parentesi graffe dopo il nome del metodo, proprio come un metodo C #. Per di Ciao, abbiamo appena inviato un messaggio alla console usando NSLog ().

Durante la digitazione, Xcode presenta alcune opzioni di completamento automatico e dovrebbe anche aver chiuso le parentesi graffe per te. Questi comportamenti possono essere modificati navigando verso Xcode > Preferenze ... nella barra dei menu e facendo clic su Modifica del testo icona.


Instantiating Objects

Proviamo a istanziare il nostro Persona classe e chiama il nostro nuovo di Ciao metodo. Ricordalo come qualsiasi programma in C, principale() è il punto di ingresso nel nostro HelloObjectiveC applicazione. Quindi, di nuovo main.m, modificare NSLog (@ "Hello, World!"); al seguente:

#importare  #import "Person.h" int main (int argc, const char * argv []) @autoreleasepool Person * somePerson = [[Person alloc] init];  restituisce 0; 

Il Persona * qualcuno espressione dichiara una variabile chiamata alcune persone e dice al compilatore che terrà un'istanza di Persona classe. L'asterisco accanto al nome della variabile indica che è a pointer, che è il modo più comune per fare riferimento agli oggetti in Objective-C. Discuteremo i puntatori in modo più dettagliato lungo la strada.

Quindi, il [[Person allocation] init] il codice crea una nuova istanza di Persona classe. La notazione delle parentesi quadre può richiedere un po 'di tempo per abituarsi, ma è concettualmente la stessa delle parentesi usate per le chiamate di metodo in C # e altri linguaggi in stile Simula. L'esempio di codice precedente è equivalente al seguente in C #:

Persona somePerson = new Person (); somePerson.init ();

Il [Assegnazione persona] call alloca la memoria richiesta per la nuova istanza e il dentro la chiamata viene utilizzata per eseguire qualsiasi tipo di codice di inizializzazione personalizzato. Nota che non ci sono "metodi di costruzione" in Objective-C come in C # o C ++ - devi chiamare manualmente il dentro metodo (o qualche sua variante) per impostare il tuo oggetto. Di conseguenza, praticamente tutta la creazione dell'oggetto in Objective-C è un processo in due fasi: allocare e quindi inizializzare. Vedrai questo schema abbastanza spesso nei programmi Objective-C.


Metodi di chiamata

Ora che abbiamo un oggetto con cui lavorare, possiamo chiamare il nostro di Ciao metodo. Si noti che la terminologia corretta in Objective-C è "inviare un messaggio", non "chiamare un metodo", ma per i nostri scopi, possiamo trattarli come sinonimi. Aggiungi la seguente linea a main.m:

[somePerson sayHello];

Proprio come il alloc/dentro metodi nell'esempio precedente, il richiamo del metodo personalizzato utilizza parentesi quadre. Di nuovo, questo è lo stesso dell'esecuzione somePerson.sayHello () in C #. Dovrebbe essere visualizzato il programma in esecuzione Ciao, mi chiamo HAL. nel pannello di output Xcode:

Output generato dal metodo sayHello

Aggiunta di parametri del metodo

A parte le parentesi quadre, le convenzioni di denominazione dei metodi di Objective-C sono uno degli aggiustamenti più grandi per gli sviluppatori provenienti da C #, C ++, Java, Python, o praticamente da qualsiasi altro linguaggio che non sia Smalltalk. I nomi dei metodi Objective-C sono progettati per essere il più descrittivi possibile. L'idea è di definire un metodo in modo tale che leggerlo ad alta voce ti dica letteralmente ciò che fa.

Ad esempio, aggiungiamo un nome parametro al nostro di Ciao metodo. Innanzitutto, dobbiamo aggiornare la dichiarazione del metodo nell'intestazione (Person.h):

- (vuoto) sayHelloToName: (NSString *) aName;

Aggiunta di un parametro in realtà cambiato il nome della funzione-il parametro non è un'entità isolata come in C # (ad es., sayHello (nome)). Il (NSString *) porzione definisce il tipo di dati del parametro e un nome è la variabile attuale a cui è possibile accedere nel codice di implementazione, che definiremo ora. Modificare di Ciao nel Person.m al codice di esempio che segue. Xcode dovrebbe completare automaticamente il nuovo nome del metodo quando inizi a digitarlo.

- (vuoto) sayHelloToName: (NSString *) aName NSLog (@ "Hello% @, il mio nome è HAL.", aName); 

Questo nuovo NSLog () la configurazione utilizza una stringa di formato per aggiungere il un nome argomento all'output. Copriremo NSLog () più in dettaglio nel prossimo capitolo, ma per ora tutto ciò che devi sapere è che sostituisce % @ nella stringa di formato con un nome. Questo è più o meno equivalente a String.Format () in C #.

Chiamando il parametro un nome potrebbe sembrare ridondante con sayHelloToName, ma ha più senso quando leggi il metodo come verrebbe invocato. Nel main.m, cambiare il di Ciao chiama a:

[somePerson sayHelloToName: @ "Bill"];

Ora, dovresti essere in grado di eseguire il tuo programma e vedere Ciao Bill, mi chiamo HAL. nel pannello di output. Come puoi vedere, i nomi dei metodi Objective-C sono prolissi, ma abbastanza istruttivi. A differenza dello stile C # sayHello (nome) invocazione, Objective-C rende molto difficile passare accidentalmente il valore sbagliato a un metodo. Naturalmente, il compromesso è che i nomi dei metodi sono lunghi, ma è per questo motivo che Xcode fornisce una funzionalità di completamento automatico così utile. Vedremo molti più verbosi (e più pratici) esempi di nomi di metodi Objective-C in questo libro.


Definizione delle proprietà

Esempio di codice incluso: con proprietà

Come con qualsiasi linguaggio orientato agli oggetti, i metodi Objective-C sono un mezzo per manipolare lo stato interno di un oggetto. Questo stato viene in genere rappresentato come un insieme di proprietà associate a un oggetto. Ad esempio, possiamo aggiungere un nome proprietà al nostro Persona interfaccia per memorizzare dinamicamente il nome di ogni istanza:

@property (copy) NSString * nome;

Il @proprietà dichiarazione inizia una nuova proprietà, il (copia) tupla specifica il comportamento della proprietà, e Nome NSString * definisce una proprietà chiamata nome che contiene un valore di stringa. In genere, le dichiarazioni di proprietà vengono posizionate prima delle dichiarazioni di metodo, ma finché si trovano da qualche parte @interfaccia e @fine nel Person.h, starai bene.

utilizzando @proprietà invece di attributi privati ​​ti dà accesso a @sintetizzare direttiva nel file di implementazione. Consente di creare automaticamente metodi di accesso per la proprietà associata. Ad esempio, in Person.m, aggiungi quanto segue (di nuovo, le implementazioni di proprietà di solito vengono prima delle implementazioni del metodo):

@synthesize nome = _nome;

@sintetizzare è una direttiva di comodità che dice al compilatore di generare metodi getter e setter per la proprietà. La parte dopo il = il segno è usato come variabile di istanza (cioè membro privato) per la proprietà, il che significa che possiamo usare _nome per accedere alla proprietà name all'interno di Person.m. Ad esempio, prova a cambiare il sayHelloToName metodo per:

- (vuoto) sayHelloToName: (NSString *) aName NSLog (@ "Hello% @, il mio nome è% @.", aName, _name); 

Per impostazione predefinita, il nome del metodo getter è uguale al nome della proprietà e il setter ha impostato anteposto al nome della proprietà in maiuscolo. Quindi, possiamo impostare dinamicamente il nostro Persona il nome dell'oggetto cambiando main.m al seguente:

Person * somePerson = [[Person alloc] init]; [somePerson setName: @ "HAL 9000"]; [somePerson sayHelloToName: @ "Bill"];

L'esecuzione del programma dovrebbe ora produrre Ciao Bill, mi chiamo HAL 9000.


Sommario

Questo capitolo ha presentato i componenti di base di una classe Objective-C. Abbiamo imparato come separare le classi nell'interfaccia ( .h) e file di implementazione ( .m), istanzia oggetti, definisce e chiama metodi e dichiara proprietà. Si spera che ti senta un po 'più a tuo agio con la notazione delle parentesi quadre di Objective-C e altre stranezze sintattiche.

Ricorda che questo capitolo è stato progettato per essere una rapida introduzione ai costrutti OOP di Objective-C, non una discussione approfondita di ciascun componente. Nei prossimi capitoli, daremo un'occhiata più dettagliata ai tipi di dati, alle dichiarazioni di proprietà, alle definizioni dei metodi e ai modelli di progettazione comuni dei programmi Objective-C.

Questa lezione rappresenta un capitolo di Objective-C, un eBook gratuito del team di Syncfusion.