In Ihrer Beschreibungsmethode verwenden Sie nicht die Eigenschaft, sondern greifen auf das Ivar zu.
-(NSString*) description
{
return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >",
timestamp,
startTime]; // <-- Hier greifen Sie auf die Instanzvariable zu und nicht auf die Eigenschaft.
}
Dies wird für Sie funktionieren:
-(NSString*) description
{
return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >",
timestamp,
self.startTime]; // <-- Hier wird der Eigenschaftszugriff verwendet.
}
Das Property-vs-Ivar-Ding verwirrt immer wieder Leute, also entschuldigen Sie mich, während ich kurz darüber schwadroniere. :) Wenn Sie dies bereits wissen, überspringen Sie bitte diesen Abschnitt.
Wenn Sie eine Eigenschaft erstellen und synthezieren, wie Sie es oben getan haben, passieren zwei Dinge:
- Es wird ein Ivar vom richtigen Typ erstellt.
- Es wird eine Getter-Funktion erstellt, die dieses Ivar zurückgibt.
Der wichtige Teil bei Punkt 2 ist, dass standardmäßig das Ivar und die Getter-Funktion (und daher die Eigenschaft) die gleichen Namen haben.
Also wird dies:
@interface Event
@property(nonatomic, assign) NSUInteger timestamp;
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime;
@end
@implementation Event
@synthesize timestamp, startTime;
@end
...zu diesem:
@interface Event {
NSUInteger timestamp;
NSUInteger startTime;
}
@end
@implementation Event
- (NSUInteger) timestamp {
return timestamp
}
- (void) setTimestamp:(NSUInteger) ts {
timestamp = ts;
}
- (NSUInteger) startTime {
return [self timestamp];
}
@end
Wie die Punktnotation funktioniert, ist folgendermaßen:
NSUInteger foo = myEvent.startTime;
bedeutet tatsächlich:
NSUInteger foo = [myEvent startTime];
Das alles soll sagen, dass, wenn Sie auf ein Ivar zugreifen, Sie auf ein Ivar zugreifen. Wenn Sie eine Eigenschaft verwenden, rufen Sie eine Funktion auf, die einen Wert zurückgibt. Noch wichtiger ist, dass es sehr einfach ist, das eine zu tun, wenn Sie eigentlich das andere gemeint haben, weil die Syntax so ähnlich ist. Aus diesem Grund synthetisieren viele Menschen routinemäßig ihre Ivars mit führenden Unterstrichen, damit es schwieriger ist, Fehler zu machen.
@property(nonatomic, assign) NSUInteger timestamp;
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime;
@synthesize timestamp = _timestamp;
@synthesize startTime = _startTime;
NSLog( @"startTime = %d", _startTime ); // OK, Zugriff auf das Ivar.
NSLog( @"startTime = %d", self.startTime ); // OK, Verwendung der Eigenschaft.
NSLog( @"startTime = %d", startTime ); // NEIN, das führt zu einem Kompilierfehler, und
// Sie werden "Huch" sagen und es dann zu einer der obigen Zeilen ändern, um
// potenziell stundenlanges Kopfzerbrechen zu vermeiden. :)