2009-05-05 16 views
14

Örnek değişkenlerim için özellikleri kullanmak istiyorum, ancak çoğu durumda, yalnızca sınıfın kendisini ayarlayıcıya erişmesini istiyorum.Genel alıcı ve özel ayarlayıcı ile özellikler oluşturabilir miyim?

Foo.h: Ben böyle bir şey yapabileceğini umuyordum

@interface Foo { 
    NSString *bar; 
} 
@property (readonly) NSString *bar; 
@end 

Foo.m:

#import "Foo.h" 

@interface Foo() 
@property (copy) NSString *bar; 
@end 

@implementation Foo 
@synthesize bar; 
@end 

Ama bu bir uyarı oluşturur:

Foo.m:4: warning: property ‘bar’ attribute in ‘Foo’ class continuation does not match class ‘Foo’ property 

ben Neyle ilgili şikayette olduğunu görebilir, ama yine de kullanışlı bir deyim gibi görünüyor. Bunu kendi belirleyicilerimi yazmadan gerçekleştirmenin başka bir yolu var mı?

cevap

31

Yaklaşımınız doğru, ancak sınıf uzantısındaki @property bar'un yeniden okunması, readwly ve readwrite dışındaki orijinal bildirimle eşleşmelidir. Yani bu çalışacaktır:

Foo.h

@interface Foo { 
    NSString *bar; 
} 
@property (copy,readonly) NSString *bar; 
@end 

Foo.m:

#import "Foo.h" 

@interface Foo() 
@property (copy,readwrite) NSString *bar; 
@end 

@implementation Foo 
@synthesize bar; 
@end 

(varsayılan özellikleri için assign değil copy olduğunu hatırlama).

+0

Huh, bu benim için hiç bir zaman gerçekleşmedi çünkü 'copy' aksi halde getter ile alakasız. Teşekkürler! –

3

Barry böyle belirtilmelidir tutan birçok diye anlamına gelen "varsayılan özellikleri için muhafaza olduğunu" dediğinde:

@property (retain) NSDate *endDate; 

bunun gibi bırakılırsa:

@property NSDate *endDate; 

atama yoluyla varsayılır derleyici

+1

Tam olarak ne dediğini kastettiğine eminim, ama haklısınız - 'atama' varsayılan değil, 'koru'. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW27 –

İlgili konular