2009-01-08 25 views
17

Objective C 2.0'da özelliklerin ne zaman kullanılacağını anlamakta sorun yaşıyorum. Int, bool, float gibi bir ilkel tür için bir özellik gerekmez gibi görünüyor. Bu doğru mu? Bu türlerin özelliklerini gösteren örnekler ve onları dışarıda bırakan başka örnekler gördüm. Örneğin, Apple'ın örnek kodda sahip oldukları:İlkel türler için özelliklerin kullanımı

... 
@interface Book : NSObject { 
    // Primary key in the database. 
    NSInteger primaryKey; 
    // Attributes. 
    NSString *title; 
    NSDate *copyright; 
    NSString *author; 

    BOOL hydrated; 
    BOOL dirty; 
    NSData *data; 
} 

@property (assign, nonatomic, readonly) NSInteger primaryKey; 
// The remaining attributes are copied rather than retained because they are value objects. 
@property (copy, nonatomic) NSString *title; 
@property (copy, nonatomic) NSDate *copyright; 
@property (copy, nonatomic) NSString *author; 
... 

Apple SQLite Book List Sample Code

Yani onların BOOL için bir mülk kullanmayın görebilirsiniz, ama onlar uygulama dosyası boyunca bir örnek değişkeni vardır tedavi olarak, değeri okumak ve değeri ayarlamak. Çevrimiçi arama Şu türler için şu özellikleri kullanan öğreticiler buldum: (@property BOOL flag). Birisi benim için bu konuda biraz ışık tutabilir mi? Teşekkürler.

cevap

34

Evet, ilkel türler için bir özellik bildirmelisiniz. Tek gerçek fark, kopyalamak veya saklamak yerine atama (varsayılan olan, bu yüzden de dışarıda bırakabilirsiniz) kullanmanızdır. Örneğin geri kalanı için konuşamıyorum, ancak büyük olasılıkla dahili örnek değişkenine doğrudan erişiyor ya da başka bir sınıftan erişiliyorsa anahtar kodlama bir erişim sağlayıcı oluşturuyor (bu gerçekten kötü bir form). Sanırım eski olan; Eğer özel bir erişimciye ihtiyacım yoksa ve sınıf değişkeni sınıfın dışında kullanılmıyorsa, sadece bir mülk ilan etmek yerine doğrudan ona başvururum. Bazı insanlar benim iddia ettiğim gibi tartışabilir, ama benim için biraz fazla gibi görünüyor.

+0

Teşekkürler Marc.Yeah, hemen hemen her şey için mülk kullanıyordum ve sadece sınıflarımda ovuyordum ve doğru olduğundan emin oldum. Bağlantıyı, söz konusu soruya atıfta bulunduğum Apple örnek koduna ekledim. Ama doğrudan erişiyor gibi görünüyorlar (self.dirty'den geçmiyor) – Sean

+3

Evet İhtiyacım yok ise ilkellere yönelik özelliklere ihtiyacım yok. Sınıfınızın dışına erişmeniz gerekiyorsa, bir mülke ihtiyacınız var. – mk12

+1

Özellikler için başka bir kullanım bellek yönetimini basitleştirmektir. Dürüst olmak gerekirse, [ivar1 sürümü] yerine self.ivar1 = nil'e sahip olabilirsiniz; ivar1 = sıfır; Bir değişiklik değil, ama hala bellek yönetimi boilerplate kodunu basitleştiren iyi bir alışkanlık. İlkellerin buna ihtiyacı yok, ama yorumunuzdan sonra özelliklerin nerede yararlı olduğunu açıklayabileceğimi düşündüm. – Luke