属性关键字

@property的属性关键字有:readwrite、readonly、assign、weak、strong、retain、copy 、nonatomic、atomic
其中,
ARC:assign、weak、strong、copy、nonatomic、atomic
MRC:assign、retain、copy、nonatomic、atomic

1、assign(MRC/ARC)与weak(ARC):

The main difference between weak and assign is that the with weak, once the object being pointed to is no longer valid, the pointer is nilled out. Assigning the pointer the value nil avoids many crashes as messages sent to nil are essentially no-ops”

意思是说:weakassign多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为nil,这样再向weak修饰的属性发送消息就不会导致野指针操作crash。
所以,在ARC模式下编程时,指针变量一定要用weak修饰,例如delegate,一定要用weak修饰,而基本数据类型、结构体、枚举需要用assgin

2、NSString是用copy还是strong?
  • 当源字符串是NSString时,由于字符串是不可变的,所以,不管是strong还是copy属性的对象,都是指向源对象,copy操作只是做了次浅拷贝。

  • 当源字符串是NSMutableString时,strong属性只是增加了源字符串的引用计数,而copy属性则是对源字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。

  • 这里还有一个性能问题,即在源字符串是NSMutableString,strong是单纯的增加对象的引用计数,而copy操作是执行了一次深拷贝,所以性能上会有所差异。而如果源字符串是NSString时,则没有这个问题。

  • 所以,在声明NSString属性时,到底是选择strong还是copy,可以根据实际情况来定。不过,一般我们将对象声明为NSString时,都不希望它改变,所以大多数情况下,建议用copy,以免因可变字符串的修改导致的一些非预期问题。

3、Strong(ARC)(修饰对象)
  1. 直接赋值并且对象的引用计数器 +1 。
  2. 在 ARC 里替代了 retain 的作用 。
4、retain(MRC)

release 旧对象( 旧对象计数器 -1 ) ,retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 。

5、copy(MRC/ARC)

其中:

MRC下:

release 旧对象( 旧对象的引用计数器 -1 ) ,copy 新对象( 新对象的引用计数器 +1 ) ,然后指向新对象 。(新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)
如:

if (_dog) { 
[_dog release]; 
} 
_dog = [dog copy];
ARC下:

copy 新对象( 新对象的引用计数器 +1 ) ,然后指向新对象。
如:

_dog = [dog copy];
6、nonatomic (ARC/MRC)
  1. 不对set方法加同步锁 。
  2. 性能好。
  3. 线程不安全。
7、readonly (只读)
  1. 让 Xcode 只生成get方法 。
  2. 不想把暴露的属性被人随便替换时 ,可以使用 。
8、readwrite (读写)(默认)
  1. 让 Xcode 生成get/set方法 。
  2. 不用 readonly 修饰时 , 默认就是 readwrite 。

你可能感兴趣的:(属性关键字)