Quanto segue non si lamenta in fase di compilazione né runtime in merito a name
ivar. Quindi, perché è così comune vedere un ivar e@property/@synthesize
.Qual è lo scopo di un ivar quando esiste una proprietà?
@interface PropTest : NSObject
{
}
@property (retain) NSString *name;
@end
@implementation PropTest
@synthesize name;
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
PropTest *p = [[PropTest new] autorelease];
p.name = @"Hello, World!";
NSLog(@"%@",p.name);
[pool drain];
return 0;
}
stampe questo codice
Hello, World!
Infatti, se accedo p->name
, ottengo un avvertimento:
warning: instance variable 'name' is @private; this will be a hard error in the future
che indica che un Ivar è stato creato per me, se uno doesn' Esistono
Se è vero, che senso ha creare manualmente l'ivar (ignorando l'ovvio, che a volte ci sono validi motivi per non utilizzare l'accessore g/setter)?
Oppure chiesto in modo diverso, dovrei sempre solo creare un ivar per una proprietà quando è necessario ignorare gli accessor?
Penso che, come ha detto Cris, ci siano alcuni problemi con la mancata dichiarazione di ivars. Il debug è quello in cui mi imbatto abbastanza spesso. – Ian1971