Properties
一个public或private的Objective-C属性使用@property语法声明的。
@property (readonly, getter=isBlue) BOOL blue;
属性持有着一个对象的状态。他们反映对象的本质属性和其他对象的关系。Properties提供一个安全、方便的方式来定义这些属性,而无需编写一组自定义访问器方法(虽然属性允许定制的getter和setter,如果需要的话)。
使用属性而不是实例变量在尽可能多的地方提供了许多好处:
- 自动合成getters和setters。当你声明一个属性,默认情况下为你创建getter和setter方法。
- 更好的意图声明一组方法。因为访问器方法的命名约定方便,很明显getter和setter方法是做什么的。
- property关键字表示关于行为的额外信息。属性提供潜在的声明的属性像assign(vs copu),weak,atomic(vs nonatomic),等等。
属性方法遵循一个简单的命名约定。getter属性的名称(例如,date),setter属性在名称前加前缀,按驼峰式命名书写(例如,setDate)。Boolean属性的命名约定是声明他们的getter方法以'is'开头。
@property (readonly, getter=isBlue) BOOL blue;
因此,以下所有调用方式都可以正常工作:
if(color.blue){}
if(color.isBlue){}
if([color isBlue]){}
在决定什么可能是一个属性时,记住,如下不是属性:
- init方法
- copy方法,mutableCopy方法
- 一个类的工厂方法
- 一个初始化一个动作并返回BOOL值的方法
- 一个明确改变内部状态对getter有副作用的方法
此外,考虑以下的规则集当在你的代码中定义属性时:
- 一个读/写属性有两个访问器方法。setter接受一个参数什么也不返回,getter不接受参数并返回一个值。可以用readwrite关键字设置这个属性。
- 一个只读属性有一个访问器方法,getter不接受参数并返回一个值。可以使用readonly关键字设置。
- getter应该幂等的(如果一个getter方法调用了两次,那么第二次结果应该和第一次是相同的)。
但是,每次geeter被调用返回结果是可接受的。
怎样适配
定义一组方法,有资格被转换成属性,诸如此类的:
- (NSColor *)backgroundColor;
- (void)setBackgroundColor:(NSColor *)color;
用@property语法和其他合适的关键字定义他们:
@property (copy) NSColor *backgroundColor;
更多关于property关键字和其他的信息,请看“Encapsulating Data”
或者,您可以在Xcode使用现代objective-c变换器自动进行转换您的代码。更多信息请看使用Xcode重构你的代码。
网友评论