2012-12-17 16 views
12

Ho una domanda, ecco il codice:operatore freccia in Objective-C

@interface MyFoo : NSObject { 
    NSString *nameStr; 
} 
@end 
@implementation MyFoo 
- (id)init { 
    self = [super init]; 
    if (self) { 
     self->nameStr = [@"some value of the string that is set right into the private ivar" copy]; 
    } 
    return self; 
} 
@end 

La domanda è: ignorando tutte le regole del C++, ignorando la vulnerabilità dump di memoria, perché esattamente non dovrei utilizzare tale operatore freccia sintassi? C'è da qualche parte nella documentazione Apple una regola che dice che non è corretta perché in futuro la classe può essere rappresentata in modo diverso da un puntatore a una struttura in runtime, ecc.?

Grazie in anticipo!

risposta

13

L'utilizzo di self->someIvar è identico a someIvar. Non è sbagliato, ma non è nemmeno necessario.

L'unica volta che utilizzo la notazione a freccia è in un'implementazione di copyWithZone: così posso copiare ciascuno dei ivars che non hanno proprietà.

SomeClass *someCopy = ... 
someCopy->ivar1 = ivar1; // = self->ivar1 
someCopy->ivar2 = ivar2; // = self->ivar2 

Dove vedi qualcosa che dice che non dovresti usare la sintassi dell'operatore di freccia?

+0

grazie mille per una risposta! È solo una questione di stile allora –

+3

È una questione di stile quando si usa 'self'. È richiesto quando si accede a ivars di un'istanza di oggetto diversa da "self". – rmaddy

+0

Sì, lo è! A molte persone piace anche sottolineare le variabili ivar, per distinguere gli ivar. –

2

L'utilizzo della notazione a freccia non è errato e vi è una differenza tra l'uso della freccia e la notazione a punti. Se si utilizza l'operatore a freccia si accede alla variabile di istanza, se si utilizza l'operatore punto si accede alla proprietà.
Non funziona come C structs in cui si utilizza la notazione a freccia per accedere a un membro di una struct point e notazione dot per accedere ai membri struct. quindi vorrei fare un esempio significativo:

@property (nonatomic,strong) NSString* text; 

Nel file di .m:

- (void) setText: (NSString*) string 
{ 
    NSLog(@"Accessing property"); 
    self->text=string; // let's suppose that text is not synthesized 
} 

Se si utilizza la notazione del punto, allora l'accesso alla proprietà e sarebbe stampare "Accesso alle proprietà". Ma questo non ha a che fare con la sintassi di C structs.

+0

"Non funziona come le strutture C in cui si utilizza la notazione a freccia per accedere a un membro di una struttura puntata." In realtà, è esattamente come funziona. "... c'è una differenza tra l'uso della freccia e la notazione dei punti". È davvero rilevante per la domanda originale? – jlehr

+0

Credo che sia colpa mia qui, sono sempre frainteso nelle mie frasi, dovrei specificare tutto.Modificato. –

3

L'uso della notazione a freccia sul solo nome di ivar per accedere a una proprietà non garantisce che verranno conservati, assegnati o ecc ... Poiché si sta indirizzando l'accesso a un ivar e non si chiama e si imposta il metodo oer getter utilizzato nelle proprietà.

Esempio:

@interface MyFoo : NSObject { 
} 
@property(nonatomic,retain) NSString *nameStr; 
@end 
@implementation MyFoo 
- (id)initWithString:(NSString *)name { 
    self = [super init]; 
    if (self) { 
     self->nameStr = name; // will not be retained 
    } 
    return self; 
} 
@end 

Per le variabili IVAR come già essere risposta ci s `nulla di male.

+0

La domanda non ha nulla a che fare con le proprietà. – rmaddy

+0

Ovviamente c'è, sta chiedendo se c'è qualche problema nell'usare la notazione a freccia, se la si usa nelle proprietà c'è un problema. –

+2

Non ha chiesto di usarlo con le proprietà. Ha chiesto di usarlo con ivars. Non è possibile utilizzare la freccia per le proprietà, si utilizza il punto per le proprietà. Rileggi la domanda quindi la mia risposta. Le proprietà non sono coinvolte. Neanche lui sta chiedendo informazioni sulla gestione della memoria. – rmaddy