2012-06-28 20 views
5

:Objective-C özelliği aşağıdaki teknik problemin ne alıcı davranışı

@property(nonatomic, assign) NSUInteger timestamp; 
@property(nonatomic, readonly, getter = timestamp) NSUInteger startTime; 
@property(nonatomic, assign) NSUInteger endTime; 

Ben bu düzenlemenin daha iyi bir yol bulmak eminim, ama bu bir noktasında ile sona erdi budur benim proje ve ben zaman damgası özelliği doğru zaman damgası olarak ayarlanmış olsa bile, startTime özelliğine erişen her zaman 0 döndürdüğünü fark ettim.

Bu benim yaptığım zaman, zaman damgası değerini yönlendirme değil varolan mülkiyet (zaman damgası) için startTime ait tutucuyu set ettikten görünüyor:

event.startTime => 0 
event.timestamp => 1340920893 

Tüm bu arada zaman damgaları vardır.

Sadece bir hatırlatma

, yukarıdaki projemin başında olması gerektiğini biliyorum ama erişen startTime damgası emlak üzerine değil ileri neden yaptığını anlamıyorum.

GÜNCELLEME benim uygulamasında

Ben bu özelliklerin hepsi sentezleyen ediyorum:

@synthesize timestamp, endTime, startTime; 

GitHub'dan benim ana fikri de bu gösteriyor kullanımı bir örnek nesnesi kontrol edin: https://gist.github.com/3013951

+0

Hata nedir? Getter ile mi? –

+0

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 ... –

+0

@ 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

cevap

5

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:

  1. bir ivar aynı tür oluşturulur.
  2. 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. :) 
+0

Elbette. üzerine gelin. Çok basit, karmaşıktı! Bazen yüzeye baktığınız zaman ve bir şeylerin derinliklerine bakıyorsunuz. Yine kendimden aptalca bir soru ... Cevabınız için teşekkür ederim. Genelde alt-tabaka uygulamasını kullandığımı ama bazı nedenlerden dolayı bu sınıfın çok basit olduğunu ve daha az kodla tutmaya karar verdiğimi belirtmek ilginç. Günün dersi: Kodlama stilinizi koruyun. Oh ve gerçekten deliye gitmeden Yığın Taşması ile ilgili soru sorma – Daniel

1

emin olun Doğru sırayla sentezleyin, böylece alıcı startTime için var olur.

//implementation 
@synthesize timestamp; 
@synthesize statTime; 
+0

Bunun sıralamasına özellikle dikkat etmedim, ancak bunu yapıyorum. Sentezlemeyi yeni bir hatta ayarlamanız gerekmedikçe. @synthesize p1, p2, p3 yapıyorum; Belki bu özelliklere öncelik vermez? – Daniel

+0

Hangi derleyiciyi kullanıyorsunuz? Apple LLVM 3.1 kullanıyorum ve benim için iyi çalışıyor. – Joe

+0

Aynı şeyi kullanıyorum. Sadece örnek bir kod için bir link yayınladım, eğer çok nazik olsaydın lütfen bunu kendi tarafınızda test et. – Daniel

İlgili konular