2009-05-05 1 views
14

インスタンス変数にプロパティを使用したいのですが、多くの場合、クラス自体がセッターにアクセスできるようにしたいだけです。私はパブリックゲッターとプライベートセッターでプロパティを作成できますか?

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

がfoo.h:

@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 

しかし、これは警告を生成し、それは何について不平を見ることができますが、それはまだ有用なイディオムのように見えます。私自身のセッターを書くことなくこれを達成するための他の方法がありますか?

答えて

31

あなたのアプローチは正しいですが、クラス拡張の@property barという再宣言は、readwriteとreadonlyを除いて元の宣言と一致しなければなりません。だから、これは動作します:

が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 

(デフォルトはプロパティ、ないcopyためassignであることを思い出してください)。

+0

「コピー」はゲッターとは無関係なので、決して私には起こりませんでした。ありがとう! –

3

バリーは彼がそれを保持意味「デフォルトプロパティのために保持された」と言う場合は、次のように指定する必要があります。それらは、次のように残っている場合は

@property (retain) NSDate *endDate; 

@property NSDate *endDate; 

アサインがで想定されますコンパイラ。

+1

私は彼が言ったことを正確に意味しているとはかなり確信していますが、あなたは正しいです - 「割り当て」がデフォルトであり、「保持」ではありません。 http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW27 –

関連する問題