美文网首页
对OC中property的一点理解

对OC中property的一点理解

作者: 卖萌凉 | 来源:发表于2015-07-21 23:56 被阅读1091次

    最近在看即将要加入的项目的代码,看到一个protocol里包含着几个property。之前没有写过类似的代码,看到这里的时候,突然疑惑了一下,发现自己对property的理解好像有点模糊。所以回家后又看了看文档,觉得的确涨了点姿势,所以要记下来~


    声明accessor methods



    官方文档对property的定义是:

    A declared property provides a syntactical shorthand for declaring a class’s accessor methods and, optionally, implementing them.

    所以说,声明一个property,实际上等于声明了对应的accessor方法。

    对于readwrite的property来说,编译器为它声明了getter方法和setter方法;而对于readonly的property来说,编译器只为它声明了getter方法。
    所以,如果想要对readonly的property发送setter消息,编译器就会报错。


    合成accessor方法和实例变量



    除了声明对应的accessor方法,程序员也可以指示编译器合成accessor方法的实现。

    比如,在一个类的implementation block中,使用类似这样的@synthesize语句:

    @synthesize firstName = _firstVar;
    

    编译器就会合成firstName这个property的accessor方法的实现和一个叫做_firstVar实例变量

    如果只是这样写@synthesize语句:

    @synthesize firstName;
    

    那么编译器合成的实例变量的名称也叫firstName


    Default Synthesis



    从Xcode 4.4和LLVM Compiler 4.0开始,编译器会默认为property合成accessor方法和实例变量,这样程序员就可以不用自己写@synthesize语句了。合成的实例变量的命名规则大概像是这样:

    @synthesize firstName = _firstName;
    

    也就是说,合成的实例变量的名字,是property名字前加上了一条下划线。

    但是也有一些比较特殊的情况:

    1. 自定义了getter和setter方法的readwrite property
      编译器是不会为这样的property生成默认的实例变量的。如果程序员需要,就得自己添加对应的@synthesize语句了。

    2. 自定义了getter方法的readonly property
      和上面一种情况类似,编译器不会为这样的property生成默认的实例变量。因为这个property是readonly的,编译器自然也不会为它声明和合成setter方法。

    3. Protocol中声明的property
      对于protocol中声明的property,default synthesis是不会作用的。所以,所有实现了这个protocol的类都需要自定义或者用@synthesize语句合成accessor方法和实例变量。

    4. 对于atomic property,不建议自定义getter和setter的其中一个


    @dynamic



    有的时候,程序员可能想要动态的提供对某个方法的实现。如果希望对property的accessor方法提供动态的实现,就可以使用@dynamic语句。

    @dynamic firstName;
    

    这指示了编译器,和这个property有关的方法会动态的提供,这时,即便编译器找不到这个property对应的accessor方法的实现,它也不会报出warning。


    关于property的建议



    苹果建议,在一般情况下尽量使用accessor方法来访问一个property,而不是直接访问它对应的实例变量。但是在一个对象的init方法deallocate方法自定义的accessor方法中不建议调用accessor方法。


    参考



    Encapsulating Data
    Declared property
    Accessor method
    Objective-C Feature Availability Index
    Automatic Property Synthesis With Xcode 4.4

    相关文章

      网友评论

          本文标题:对OC中property的一点理解

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