我想为我的实例变量使用属性,但在很多情况下,我只希望类本身可以访问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的情况下完成此任务?
答案 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由编译器承担。