Açıklama yönteminde, özelliği kullanmıyorsunuz, ivar'a erişiyorsunuz.
-(NSString*) description
{
return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >",
timestamp,
self.startTime]; // <-- This is using the property accessor.
}
mülk-vs-Ivar şey her zaman insanları haberci yukarıya, yani bir dakika bu konuda ramble bana müsaade:
-(NSString*) description
{
return [NSString stringWithFormat:@"Event< timestamp:%d, start:%d >",
timestamp,
startTime]; // <-- This is accessing the instance variable, not the property.
}
Bu sizin için çalışacaktır. :) Tüm bunları zaten biliyorsanız, ileri atlayın. Yukarıda olduğu gibi
oluşturmak ve bir mülk sentezlemek
, iki şey olur:
- bir ivar aynı tür oluşturulur.
- Bir iter işlevi oluşturuldu, bu ivar'ı döndürür. nokta 2 hakkında
önemli bir parçası varsayılan Ivar ve alıcı işlevi tarafından (ve dolayısıyla, mülkiyet) aynı isimleri sahip olmasıdır.
Yani bu:
@interface Event
@property(nonatomic, assign) NSUInteger timestamp;
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime;
@end
@implementation Event
@synthesize timestamp, startTime;
@end
...Bu dönüşür:
NSUInteger foo = myEvent.startTime;
gerçekten bir ivar erişirken, sen söylemek
NSUInteger foo = [myEvent startTime];
Bütün bunlar yapar:
@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
Nasıl nokta sözdizimi çalışır bu böyledir ... iyi, bir ivar erişim. Bir özelliği kullandığınızda, bir değer döndüren bir işlevi çağırırsınız. Daha da önemlisi, diğerini kastettiğinizde bir şeyi yapmak son derece kolaydır, çünkü sözdizimi çok benzerdir. Bu nedenle birçok insan rutin olarak ivarlarını önde gelen alt çizgilerle sentezler, böylece dağınıklığı daha da zorlaşır.
@property(nonatomic, assign) NSUInteger timestamp;
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime;
@synthesize timestamp = _timestamp;
@synthesize startTime = _startTime;
NSLog(@"startTime = %d", _startTime); // OK, accessing the ivar.
NSLog(@"startTime = %d", self.startTime); // OK, using the property.
NSLog(@"startTime = %d", startTime); // NO, that'll cause a compile error, and
// you'll say "whoops", and then change it
// to one of the above, thereby avoiding
// potentially hours of head-scratching. :)
Hata nedir? Getter ile mi? –
Aslında, cevabım yanlıştı. Aynı seçiciye bağlı birden fazla mülkünüz varsa farketmez. Bu konuda bir sorun olmadığını söyleyebilirim ... –
@ RichardJ.RossIII Testimi sadece bir ARC projesinde en son XCode'da çalıştırdım. Bunun bir noktada Clang'da bir değişiklik olması mümkün olabilir. – Joe