Objective-C :(私有/公共属性)为外部类调用创建一个readonly属性,为self调用创建readwrite

时间:2011-01-29 15:07:20

标签: objective-c cocoa

您是否知道如何为外部调用创建一个属性readonly并为内部调用进行readwrite?

我以前读过的东西似乎是

在.h

@property(nonatomic, readonly) NSDate* theDate;

在.m

@interface TheClassName()
@property(nonatomic, retain) NSDate* theDate;
@end

但是这会在编译.m时引发警告“TheClassName类继续中的属性theDate属性与类TheClassName属性不匹配”。

无论如何,它似乎工作(可以读取但不能从课外设置,可以从内部完成)但我应该错过某些事情来避免警告。 或者如果你知道更好的方法来做到这一点......

4 个答案:

答案 0 :(得分:62)

在你的.h:

@property(nonatomic, retain, readonly) NSDate* theDate;

在你的.m:

@interface TheClassName()
@property(nonatomic, retain, readwrite) NSDate* theDate;
@end

答案 1 :(得分:3)

如果你转向ARC,这个问题基本上已经消除了。您可以在标题中声明一次,而不是两个属性声明。

@property(nonatomic, readonly) NSDate* theDate;

然后在类扩展中,只需声明一个__strong实例变量。

@interface TheClassName()
{
    __strong NSDate* _theDate;
}
@end

并在实施中适当地合成它们

@implementation TheClassName
@synthesize theDate = _theDate;

现在您可以设置实例变量。

_theDate = [NSDate date];

ARC会神奇地将适当的保留/释放功能内联到您的代码中,以将其视为强/保留变量。这样做的好处是比旧样式(保留)属性更快,ARC在编译时内联保留/释放代码。

答案 2 :(得分:-1)

如果属性由变量支持,则该类变量是默认的类内部读写。将属性设置为只读,您的设计目标将得到满足。在课程内部,请参考变量而不预先self.

答案 3 :(得分:-2)

在.m中,你不应该再次放置@property。不过,我不确定它会产生什么影响。 你的意思是使用@synthesize吗?

请注意,无论如何,无论是对外部世界的只读,都会在类实现中读/写。