zoukankan      html  css  js  c++  java
  • 对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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    logging 用于便捷记录日志且线程安全的模块
    win10安装多个mysql实例
    Windows安装mysql-msi
    webAPI解决跨域问题
    net core通过中间件防御Xss
    导出excel
    DES加密/解密类
    MySQL优化配置
    上传文件到服务器
    HttpWebRequest调用接口
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8421525.html
Copyright © 2011-2022 走看看