Objective-C的属性(property)解析:

来源:互联网 发布:精点数据公司怎么样 编辑:程序博客网 时间:2024/06/10 08:29

Property

“属性”(property)是Objective-C的一项特性,用于封装对象中的数据。使用了属性的话,编译器就会自动编写访问这些属性所需的方法(setter和getter),这个过程称为“自动合成”(autosynthesis)。
@property等同于在.h文件中声明实例变量的get/set方法,@synthesize等同于在.m文件中实现实例变量的get/set方法

Attribute

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

1. 原子性

  • atomic:默认由编译器所合成的方法会通过锁定机制确保其原子性。
  • nonatomic:使用nonatomic语义的话,两个线程读写同一属性,那么当其中一个线程正在改写某属性值时,另外一个线程也许会突然闯入,把尚未修改好的属性值读取出来。发生这种情况时,线程读到的属性值可能不对。

但是在实际开发iOS程序中,所有属性都声明为nonatomic,因为在iOS使用同步锁的开销较大,会产生性能问题。一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全”(thread safety),若要实现“线程安全”的操作,还需要采用更为深层的锁定机制才行。因此,开发iOS程序一般都会使用nonatomic属性

2. 读写/权限

  • readwrite:读写,具备readwrite的属性同时拥有setter和getter方法,若该属性由@synthesize实现,则编译器会自动生成这两个方法。
  • readonly:只读,仅拥有getter方法。可以用这个attribute把某个属性对外公布为只读属性,然后在”class-continuation分类”中将其重新定义为读写属性。

3. 内存管理语义

  • assign:会生成直接赋值给实例对象的setter方法,通常用来修饰诸如NSInteger、CGFloat等原始类型(primitive type),或者是在类中不想真正持有的对象,类似delegate等。
  • strong: 表明该属性定义了一种“拥有关系”。为strong属性设置新值时,setter会先保留新值,并释放旧值,然后在将新值设置上去。
  • weak:表明属性定义了一种“非拥有关系”,为weak属性设置新值时,setter既不保留新值,也不释放旧值。然而在属性所指的对象遭到摧毁时,属性值也会清空。
  • copy:setter并不保留新值,而是将其“拷贝”。当属性为NSString* 时,通常用这个attribute来保护其封装性,因为传递给setter 的新值有可能指向一个NSMutableString类的实例,此时若是不拷贝字符串,那么在设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。通常的,只要实现属性所用的对象是可变的(mutable),就应该在设置新属性值时拷贝一份。
  • retain:setter方法会增加对象的保留数(retain count),用在属性是指向某个对象的指针时。

4. 方法名

  • getter = < name>:指定getter的方法名。比如说,在UISwitch类中,表示开关是否打开的属性就是这样定义的:
@property (nonatomic, getter=isOn) BOOL on;
  • setter = < name>:指定setter的方法名,这种用法不太常见。
1 0