美文网首页程序员
采用现代Objective-C (2)

采用现代Objective-C (2)

作者: Runxing | 来源:发表于2014-05-17 15:24 被阅读88次

    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重构你的代码

    相关文章

      网友评论

        本文标题:采用现代Objective-C (2)

        本文链接:https://www.haomeiwen.com/subject/enxdtttx.html