2013-03-15 8 views
8

Ho appena avuto la chiara spiegazione di cosa "->" notazione è circa qui: Dot (".") operator and arrow ("->") operator use in C vs. Objective-CQuando/dove la notazione a freccia "->" dovrebbe essere usata in Objective-C?

Ma io ancora non capisco quali sono realmente i casi d'uso di questa notazione in Objective-C?

Ecco l'esempio di che cosa sto parlando: https://github.com/gnustep/gnustep-base/blob/master/Source/NSOperation.m - perché tutte queste stringhe come Internal-> Blocco sono scritti lì - perché non utilizzare ivars o dot-notazione?


Argomento correlato: Performance of object_setClass() instead of assigning isa pointer.

+0

Questa risposta contiene tutto, cos'altro si desidera sapere> –

+0

@AnoopVaidya, l'articolo citato non descrive i casi d'uso e in particolare non descrive il motivo per cui una notazione dovrebbe essere preferita rispetto all'altra. Penso, ho fatto la domanda significativa qui. –

+1

La mia ipotesi è che gli autori non volessero usare la notazione a punti per evitare effetti collaterali dei metodi di accesso chiamante + volevano essere in grado di ridefinire il puntatore "interno" con qualsiasi cosa in futuro, quindi -> fornisce esattamente quella flessibilità – Vladimir

risposta

7

Dalla tua domanda, non è chiaro se capisci cosa fa l'operatore ->.

Questo esempio nella sorgente NSOperation GNUStep è utilizzando un ivar. Questo è ciò che fa l'operatore -> - dereferenzia il puntatore e accede al membro nominato.

Per quanto riguarda "Perché non utilizzare la notazione punto?" La risposta ovvia sarebbe che non volevano passare attraverso una Accessor. Passare attraverso un accessor è più lento dell'accesso diretto e non ha alcun beneficio reale in un caso come questo in cui stiamo solo lavorando con uno stato interno "stupido".

Quindi quando lo si deve usare nel codice Objective-C? Principalmente quando si accede a una struttura tramite un puntatore. Raramente è necessario accedere direttamente alle variabili di istanza di un altro oggetto. Se lo fai, quel codice è l'eccezione, non la regola.

+0

Grazie per la risposta. Abbastanza chiaro "... Se lo fai, quel codice è l'eccezione, non la regola.". Potresti spiegare, in che tipo di situazioni questo potrebbe essere necessario? (In particolare mi chiedo perché raramente ho bisogno di accedere direttamente a ivars, vedi anche fx come "Convenzioni di Github Objective-C" consiglia: non accedere a ivar a meno che tu non sia in -init o -dealloc e così via) –

+1

@Stanislaw: Non so davvero se posso spiegare dove sarebbe stato necessario molto più precisamente di "situazioni eccezionali". Sono piuttosto tentato di dire "Situazioni in cui è necessario trarre il massimo dalle prestazioni e non desiderare il sovraccarico dei messaggi inviati", ma anche in quelle situazioni ci sono spesso migliori ottimizzazioni a livello di progettazione che è possibile fare vorrebbe ovviare al bisogno. Ma questo è il tipo di situazione in cui spesso si presenta. – Chuck

+0

Ho letto il tuo commento come che ho bisogno di usare -> "quasi mai"))). Grazie. –

-2

-> viene utilizzato per accedere al membro della struttura in linguaggio Objective C.

esempio:

struct student 
{ 
    name:String 
    age: NSInteger 
} 

Per accedere membro "nome" della struttura studente è necessario utilizzare -> operatore LIKE:

student stu; 
st->name = @"XYZ" 
+0

Errato su così tanti livelli: 'struct' è C, non Objective-C. Quella 'struct' assomiglia più a Swift che a C.' -> 'è necessaria solo per accedere ai campi se' struct' si trova nell'heap, piuttosto che nella pila. – Droppy

+0

ma quando creiamo l'oggetto di cui sopra, sarà in heap mentre memorizza l'oggetto anziché i tipi di dati. –

+0

No. In quel caso particolare sarebbe 'st.name'. Se hai usato 'student * stu = malloc (sizeof (studente));' allora userai '->'. – Droppy

0

può essere in questo case.I visto un esempio in Reachability.m file.Here di apple è:

@implementation Reachability 
{ 
    SCNetworkReachabilityRef _reachabilityRef; 
} 

+ (instancetype)reachabilityWithHostName:(NSString *)hostName 
{ 
    ... 
    if (reachability != NULL) 
    { 
     returnValue= [[self alloc] init]; 
     if (returnValue != NULL) 
     { 
      returnValue->_reachabilityRef = reachability; 
     } 
     ... 
    } 
    return returnValue; 
} 

in modo da poter utilizzare per chiamare una variabile globale da un oggetto in un metodo di classe.

Problemi correlati