• 对OC中property的一点理解


    最近在看即将要加入的项目的代码,看到一个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方法。



    作者:卖萌凉
    链接:https://www.jianshu.com/p/455ec3aff322
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    virtualbox+vagrant学习-2(command cli)-19-vagrant box命令
    virtualbox+vagrant学习-2(command cli)-24-Aliases别名
    virtualbox+vagrant学习-2(command cli)-23-vagrant version命令
    virtualbox+vagrant学习-2(command cli)-22-vagrant validate命令
    如何快速学习一门技术或进入一个岗位
    EL表达式详解
    关于JSP乱码问题
    java mail使用qq邮箱发邮件的配置方法
    数据库命名规范
    java中的Serializable接口的作用
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8421525.html
Copyright © 2020-2023  润新知