-对象消息运行期)第6条:理解“属性”这一概念

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-对象消息运行期)第6条:理解“属性”这一概念相关的知识,希望对你有一定的参考价值。

属性可以拥有的特质分为四类:

原子性

  在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicty)。如果属性具备nonatomic特质,则不使用同步锁。请注意,尽管没有名为“atomic”的特质(如果某属性不具备nonatomic特质,那它就是“原子的”(atomic)),但是仍然可以在属性特质中写明这一点,编译器不会报错。若是自己定义存取方法,那么就应该遵从与属性特质相符的原子性。

 

读/写权限

  •   具备readwrite(读写)特质的属性拥有“获取方法“(getter)与“设置方法”(setter)。若该属性由@synthesize实现,则编译器会自动生成这两个方法。
  •     具备readonly(只读)特质的属性仅拥有获取方法,只有当该属性由@synthesize实现时,编译器才会为其合成获取方法。你可以用此特质把某个属性对外公开为只读属性,然后在”class-continuation分类“中将其重新定义为读写属性。

 

内存管理语义

  •   assign ”设置方法“只会执行针对”纯量类型“(scalar type,例如CGFloat或NSInteger等)的简单赋值操作。
  •     strong 此特质表明该属性定义了一种”拥有关系”(owning relationship)。为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。
  •     weak   此特质表明该属性定义了一种“非拥有关系”(nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。
  •     unsafe_unretained 此特质的语义和assign相同,但是它适用于“对象类型”(object type),该特质表达一种“非拥有关系”(“不保留”,unretained),当目标对象遭到摧毁时,属性值不会自动清空(“不安全”,unsafe),这一点与weak有区别。
  •     copy 此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝”(copy)。当属性类型为NSString*时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString的类的实例。这个类是NSString的子类,表示一种可以修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变”(immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的”(mutable),就应该在设置新属性值时拷贝一份。

 

方法名

    可通过如下特质来指定存取方法的方法名:

  •     getter=<name> 指定“获取方法”的方法名。如果某属性是Boolean型,而你想为其获取方法加上“is”前缀,那么就可以用这个方法来指定。比如说,在UISwitch类中,表示“开关”(switch)是否打开的属性就是这样定义的:     @property (nonatomic,getter=isOn) Bool on;
  •        setter=<name>指定“设置方法”的方法名。这种用法不太常见。

 

 

   要点

  •     可以用@property语法来定义对象中所封装的数据。
  •        通过“特质”来指定存储数据所需的正确语义。
  •        在设置属性所对应的实例变量时,一定要遵从该属性所声明的语义。

以上是关于-对象消息运行期)第6条:理解“属性”这一概念的主要内容,如果未能解决你的问题,请参考以下文章

第6条:理解“属性”这一概念(中)

第12条:理解消息转发机制

《编写高质量iOS与OS X代码的52个有效方法》

第8条:理解“对象等同性”这一概念

6理解“属性”这一概念

第37条:理解“块”这一概念