Sono piuttosto confuso su proprietà e variabili di istanza in Objective-C.Variabili di proprietà e istanze in Objective-C
Sono circa a metà di "Cocoa Programming for Mac OS X" di Aaron Hillegass e tutto è logico. Si potrebbe dichiarare una classe simile a questa:
@class Something;
@interface MyClass : NSObject {
NSString *name;
NSArray *items;
Something *something;
IBOutlet NSTextField *myTextField;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
Poiché altri oggetti hanno bisogno di manipolare le nostre variabili di istanza
name
eitems
, usiamo@property
/@synthesize
per generare funzioni di accesso/mutatori per loro. All'interno della nostra classe, non usiamo gli accessor/mutators, ma interagiamo direttamente con la variabile di istanza.something
è solo una variabile di istanza che useremo nella nostra classe, e poiché nessun altro ha bisogno di usarlo, non creiamo una coppia di accessori e mutatori per questo.Abbiamo bisogno di interagire con un campo di testo nella nostra interfaccia utente, quindi dichiariamo uno
IBOutlet
per esso, lo colleghiamo e il gioco è fatto.
Tutto molto logico.
Tuttavia, nel mondo iPhone, le cose sembrano essere diverse. Le persone dichiarano le proprietà per ogni singola variabile di istanza, dichiarano le proprietà per IBOutlets
e utilizzano accessors/mutators per interagire con le variabili di istanza all'interno della classe (ad esempio scrivono [self setName:@"Test"]
anziché name = @"Test"
).
Perché? Cosa sta succedendo? Queste differenze sono specifiche per iPhone? Quali sono i vantaggi di dichiarare le proprietà per tutte le variabili di istanza, dichiarare le proprietà per IBOutlets
e utilizzare accessors/mutators all'interno della propria classe?
Per chiunque in una situazione simile: oltre alle risposte qui sotto, vedere http://stackoverflow.com/questions/1221516/does-an-iboutlet-needs- to-be-a-property-synthesized e http://stackoverflow.com/questions/1250518/what-happens-if-i-dont-retain-iboutlet per il motivo per cui dichiareresti IBOutlet come proprietà. –