2012-03-29 8 views
6

In un recente modello di progetto Xcode 4.3, alcuni @synthesze sono dichiarate come:singola e doppia sottolineatura differenza nel dichiarare @synthesize

@synthesize window = _window; 
@synthesize managedObjectContext = __managedObjectContext; 
@synthesize managedObjectModel = __managedObjectModel; 
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 
@synthesize navigationController = _navigationController; 

Alcune sono dotate di una doppia sottolineatura (__) come prefisso. Perché?

Tutto ciò che riguarda l'attributo readonly?

@property (strong, nonatomic) UIWindow *window; 
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; 
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 
@property (strong, nonatomic) UINavigationController *navigationController; 

risposta

3

Probabilmente non dovrebbero usare una doppia sottolineatura, se sono destinati all'uso nel proprio programma. Mi aspetto che sia solo una svista da parte di chiunque abbia scritto quell'esempio di modello. In pratica, è improbabile che possano causare problemi.

Lo standard C riserva tutti gli identificatori che iniziano con una doppia sottolineatura per l'uso proprio dell'implementazione. Poiché Objective-C è un superset di C, non dovresti usare questi identificatori anche nei programmi Objective-C. Dal spec C, sezione 7.1.3 identificatori riservati:

Tutti gli identificatori che iniziano con un carattere di sottolineatura e sia una lettera maiuscola o nell'altro sottolineatura sono sempre riservati per qualsiasi uso.

1

Probabilmente in questo caso. In generale, la mela tende ad usare i nomi con prefisso per fare riferimento alla copia esterna di una variabile (come quando è passata come una funzione, o la ref diretta invece della proprietà). Chiunque abbia scritto quel codice probabilmente pensava di essere intelligente aggiungendo un extra _ per la sola lettura, ma questo è in genere una cattiva pratica poiché C riserva il __ per specificare le direttive del compilatore.

Non ho mai visto un compilatore C lamentarsi di __ vars e LLVM non sembra dispiacere, ma probabilmente non è una buona pratica.

Problemi correlati