2013-02-20 13 views
7

Mi rendo conto che il 99% di voi pensa "ma che cazzo ..." Ma per favore aiutatemi a capire come usare pointers. Sono sicuro che la mia domanda specifica aiuterebbe molti neofiti.Qual è il più grande vantaggio dell'uso di puntatori in ObjectiveC

Capisco quali puntatori sono e che sono un riferimento a un indirizzo in memoria e che utilizzando l'operatore (*) è possibile ottenere il valore in quell'indirizzo.

Diciamo:

int counter = 10; 
int *somePointer = &counter; 

ora ho l'indirizzo in memoria di counter, e posso indirettamente indicare il suo valore in questo modo:

int x = *somePointer; 

Il che rende x = 10, giusto?

Ma questo è l'esempio più semplice, e in questo caso potrei usare int x = counter; e ottenere quel valore, quindi per favore spiega perché i puntatori sono davvero una cosa così importante in Objective-C e in altri linguaggi ... in tal caso solo un puntatore ha senso?

Apprezzalo.

+3

Un puntatore non è un riferimento a un indirizzo. Si può dire che un puntatore è un riferimento alla memoria o che è un riferimento a una variabile, ma * è * un indirizzo. (Tecnicamente, un puntatore è una variabile e il suo valore è un indirizzo. L'inglese è ambiguo.) –

+4

Uno non assegna semplicemente oggetti in modo statico. – CodaFi

+0

Si potrebbe voler iniziare lì: http://stackoverflow.com/questions/5203284/objective-c-and-pointers/5203296#5203296 –

risposta

2

Qual è il più grande vantaggio di utilizzare puntatori in ObjectiveC

direi che il più grande vantaggio è che si può utilizzare ObjectiveC a tutti - tutti gli oggetti ObjectiveC sono puntatori sono accesso tramite puntatori (il compilatore e il runtime non consentono di creare oggetti staticamente), quindi non si otterrebbe più senza di essi ...

+0

Grazie allot @ H2CO3 – NickCave

5

Objective-C ha dei puntatori perché è un'evoluzione di C, che puntatori usati ampiamente. Il vantaggio di un puntatore in un linguaggio orientato agli oggetti come Objective-C è che dopo aver creato un oggetto, è possibile passare attorno a un puntatore all'oggetto invece di passare attorno all'oggetto stesso. In altre parole, se si dispone di un oggetto che occupa una grande quantità di spazio di archiviazione, passare attorno a un puntatore è molto più efficiente in termini di memoria rispetto al passare una copia dell'oggetto stesso. Ciò potrebbe non essere evidente in casi semplici quando si tratta solo di tipi primitivi come int s, ma quando si inizia a trattare con oggetti più complessi, la memoria e il risparmio di tempo sono enormi.

Ancora più importante, i puntatori rendono molto più facile per le diverse parti del tuo codice di comunicare tra loro. Se le variabili possono essere passate solo alle funzioni "per valore" anziché "per riferimento" (che è ciò che accade quando si usano i puntatori), allora le funzioni non potrebbero mai alterare i loro input. Potrebbero solo cambiare lo stato del tuo programma restituendo un valore o cambiando una variabile globale, il cui uso eccessivo porta generalmente a un codice non organizzato e disordinato.

Ecco un esempio concreto. Supponiamo di avere un metodo di Objective-C che analizzare una stringa JSON e restituire un NSDictionary:

+ (NSDictionary *)parseJsonString:(NSString *)json 
          error:(NSError **)error; 

Il metodo farà il parsing e restituire un NSDictionary se tutto va bene. Ma cosa succede se c'è qualche problema con la stringa di input? Vogliamo un modo per indicare all'utente (o almeno al programmatore) cosa è successo, quindi abbiamo un puntatore a un puntatore a un NSError, che conterrà quell'informazione.Se il nostro metodo fallisce (probabilmente restituendo nil), è possibile annullare il riferimento al parametro error per vedere cosa è andato storto. Quello che abbiamo effettivamente fatto è dare al nostro metodo due diversi tipi di valori di ritorno: di solito, restituirà uno NSDictionary, ma potrebbe anche restituire uno NSError.

Se vuoi saperne di più su questo, puoi avere più fortuna a cercare "puntatori in C" piuttosto che "puntatori in Objective-C"; i puntatori sono ovviamente usati estensivamente in Objective-C, ma tutti i meccanismi sottostanti sono identici a quelli di C stesso.

+2

Il meccanismo sottostante non è esattamente identico a C stesso, ma * è * C – CodaFi

+0

@CodaFi Sei stato brillante questa notte, come sempre: D –

+0

@CodaFi Sì, ben detto. – bdesham

1

dell'oggetto:

Che cosa succede se ti ho detto di scrivermi un programma che mantenere una serie di contatori, ma il numero di contatori andranno inserite dall'utente quando ha iniziato il programma. Lo codifichiamo con una matrice di numeri interi allocati nell'heap.

int *counters = malloc(numOfCounters * sizeof(int)); 

Malloc lavora direttamente con la memoria, quindi per sua natura restituisce un puntatore. Tutti gli oggetti Objective-C sono allocati heap con malloc, quindi questi sono sempre puntatori.

dell'oggetto:

Che cosa succede se ti ho detto di scrivermi una funzione che leggere un file, e poi corse un'altra funzione quando è stato fatto. Tuttavia, questa altra funzione era sconosciuta e sarebbe stata aggiunta da altre persone, persone che non conoscevo nemmeno.

Per questo abbiamo il "callback". Scriveresti una funzione simile a questa:

int ReadAndCallBack(FILE *fileToRead, int numBytes, int whence, void(*callback)(char *)); 

L'ultimo argomento è un puntatore a una funzione. Quando qualcuno chiama la funzione che hai scritto, che fanno qualcosa di simile:

void MyDataFunction(char *dataToProcess); 

ReadAndCallBack(myFile, 1024, 0, MyDataFunction); 

dell'oggetto:

Passando un puntatore come argomento di funzione è il modo più comune di restituzione di valori multipli da una funzione . Nelle librerie Carbon su OSX, quasi tutte le funzioni della libreria restituiscono uno stato di errore, il che pone un problema se una funzione di libreria deve restituire qualcosa di utile al programmatore. Quindi si passa l'indirizzo dove si desidera la funzione di informazioni di mano a te ...

int size = 0; 
int error = GetFileSize(afilePath,&size); 

Se la chiamata di funzione restituisce un errore, è in error, se non ci fosse alcun errore, probabilmente error essere zero e size conterrà ciò di cui abbiamo bisogno.

+0

E se ti dicessi che non una leccata di questa risposta era in ObjC? (salva l'allocazione dell'heap, ovviamente) – CodaFi

+0

Ammetto di non aver mai veramente capito i miei primi mesi con Objective-C, e ho dovuto imparare la C semplice per farla finita con il concetto. – iluvcapra

-1

Il più grande vantaggio dei puntatori in Objective-C, o in qualsiasi lingua con allocazione dinamica, è che il tuo programma può gestire più elementi rispetto ai nomi che hai inventato nel codice sorgente.

+0

Scusa, ma questo non ha molto senso. in che modo il puntatore influisce sui nomi delle variabili? ne fai un po 'come confondere puntatore con gli array? – vikingosegundo

Problemi correlati