• iOS @property语句


    @property声明的形式是:

      @property ( attributes ) type name;

      type和name的含义一目了然,attributes描述了如何编写访问器。

    一、assign retain copy

      这些属性影响到合成的setter如何构建。

      如果使用assign,setter直接将新值赋值给特性。

        myProperty = newValue;

      assign属性是一个非对象特性的唯一选择。

      对于在引用计数下的对象特性,assign创建了一个弱引用。

      要使用copy,特性的类型必须是能够复制的类。类必须通过实现copyWithZone:而采用NSCopying协议。

      如果没有显示指定assign,retain,copy,编译器假设一个 默认值assign,这对于基础类型没有问题。然而,对于引用计数下的对象特性,如果你没有指定三者之一,则会得到一个编译器警告。

      如何在复制和保留之间做出选择?这取决于你的对象的设计,以及特性是什么。

      如果特性要作用一个可变对象的当前状态的快照,则应该复制它。

      如果用来设置一个特性的对象是要对一个实体自身建模,而不是对实体的当前状态建模,则应该保留它。

    二、readwrite readonly 

      如果一个特性是声明为readwrite的,则该特性的值可以设置也可以获取,两个访问器都合成,这是默认的。

        如果特性是readonly的,只有getter合成。如果试图使用setter,则会得到一个“does not respond to selector”异常而崩溃。

    三、nonatomic

      这个属性有点奇怪,因为他没有对应的atomic关键字。没有声明为nonatomic的特性,默认都是atomic的。如果指定了nonatomic,则编译器合成访问器而不考虑线程安全性。

      当在多线程程序中访问一个特性时,有可能在完成设置和获取之前,一个线程被另一个线程中断了。如果第二个线程在中断过程中修改了特性,那么在第一个线程中返回的或设置的值可能会不一致或错误。为了防止这种情况,可以声明特性为atmoic的(通过省略关键字nonatomic),然后,合成的访问器将是atomic的,这样设置或获取都会正确的完成,而不会受到另一个线程的打扰。

      对于一个非对象特性或者当使用垃圾收集时,getter是一条简单的返回语句,而setter是一条简单的赋值,并且总是atomic的。对于引用计数下的 对象特性,还会有更多的困难。合成的setter和getter使用锁来防止其他线程中断或获取。此外,getter保留然后自动释放返回的对象。

      在getter部分的行为,防止了另一个线程释放该对象,从而潜在的导致在线程有机会使用或保留它之前,其引用计数减少到0.

      锁在性能方面付出了代价,如果你不打算编写多线程代码,则应该将自己的特性声明为nonatomic的。然后,合成的访问器不会使用锁。getter直接返回对象。

    四、setter=name 和 getter=name

      通常,特性myProperty的合成名称,对于setter和getter来说,分别是setProperty和getProperty。setter = name 和 getter = name 允许你提供其他的名称。其主要用途是允许针对一个布尔特性的getter,这提高了代码的可读性。

    五、attributes 和 @dynamic

      如果提供了自己的访问器方法的实现,那么编译器不会检查你提供的方法是否与对应的@property声明中的attributes一致。它默默的允许你做一些不正确的事。

      eg:对声明为copy的特性赋值,或者为声明为readonly的特性提供一个setter方法。

    六、

        

        

  • 相关阅读:
    并查集的来龙去脉
    改变像素
    PHP自学之路-----javascript基础入门
    推荐管理类图书
    ewebeditor编辑器ASP/ASPX/PHP/JSP版本漏洞利用总结及解决方法
    PHP文件包含漏洞剖析
    文件上传漏洞总结
    服务器软件解析漏洞总结
    JAVA环境变量配置
    Python2.x与Python3.x的区别
  • 原文地址:https://www.cnblogs.com/roxy/p/5685843.html
Copyright © 2020-2023  润新知