我可以使用公共getter和private setter创建属性吗?

时间:2009-05-05 22:42:55

标签: iphone objective-c cocoa

我想为我的实例变量使用属性,但在很多情况下,我只希望类本身可以访问setter。我希望我能做到这样的事情:

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

但这会产生警告:

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

我可以看到它在抱怨什么,但它似乎仍然是一个有用的习语。有没有其他方法可以在不编写自己的setter的情况下完成此任务?

2 个答案:

答案 0 :(得分: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

(回想一下,属性的默认值为assign,而不是copy)。

答案 1 :(得分:3)

当Barry说“默认为属性保留”时,他的意思是应该像这样指定retain:

@property (retain) NSDate *endDate;

如果他们这样离开:

@property NSDate *endDate;

assign由编译器承担。