E 'davvero molto utile, ma la maggior parte della gente non sa perché, e questo è un peccato. Apple utilizza i caratteri di sottolineatura per separare il modo in cui altri oggetti accedono alle variabili di un particolare oggetto e il modo in cui un particolare oggetto accede alle proprie variabili. Ora, questo può sembrare un po 'strano, ma immaginate quanto segue: Probabilmente tutti riconosciamo il seguente avviso del compilatore
.h
@property (nonatomic, retain, readonly) UITableView *tableView;
.m
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self loadSomethingElseForTableView:tableView];
}
Questo si tradurrà in un avviso del compilatore, perché non sa wether si fa riferimento alla variabile locale "tableView" o la variabile di istanza. Pertanto, Apple consiglia di aggiungere quanto segue all'inizio di @implementation.
@synthesize tableView = _tableView;
Ora, quando si fa riferimento al _tableView
, il compilatore sa che vuoi dire la variabile di istanza, e non quello locale.
Inoltre, questo rende molto più facile capire la Garbage Collection in Obj-C, e per evitare di commettere errori comuni.
Per esempio, quando si fa la seguente:
@property (nonatomic, retain, readonly) NSString *title;
- (id)initWithTitle:(NSString *)title {
if ((self = [super init])) {
self.title = title; // Is not possible, since it's read only.
title = title; // Is not possible, since it's the same (local) variable.
// Changing the method to initWithTitle:(NSString *)aTitle;
title = aTitle;
}
return self;
}
Ora, dal momento che non si utilizza il setter di default (in realtà, non è possibile, perché è di sola lettura) si necessità di mantenere la variabile te stesso. Questo è molto più facile da ricordare quando assegni a ogni variabile di istanza un prefisso (quindi sai che devi mantenerlo tu stesso).
Quindi, in sostanza, è importante capire la differenza tra self.variable
e (_
) variable
. (Vale a dire: self.variable
mappe a [self setVariable:...]
e variable
mappe direttamente al puntatore
Inoltre, quando si aggiunge come una variabile privata, in questo modo:.
@interface TSSomeObject : NSObject {
@private
NSString *_privateTitle;
}
@end
Il prefisso di sottolineatura non è realmente necessario, a meno che tu non incontri le variabili locali che hanno lo stesso nome, oltre a questo, ancora, è anche un modo semplice per ricordarti che si tratta di un puntatore locale e che devi conservare (e rilasciare) la variabile quando la assegni al tuo oggetto.
Che cosa è sbagliato è quello di creare una proprietà con un prefisso di sottolineatura, come questo:
@property (nonatomic, retain) NSString *_title;
che è davvero sbagliato, e io non sono nemmeno intenzione di spiegare perché;)
Quindi sì! Dovresti davvero usare i prefissi di sottolineatura, rende il tuo codice molto più facile da leggere e da interpretare dal compilatore! In Xcode 4, Apple ha persino aggiunto questi @synthesize
ai modelli predefiniti.
Oppure statico in C. –