iOS中属性的声明

1.atomic和nonatomic

atomic:原子性,是指事务的一个完整操作,操作成功就提交,反之就回滚,原子操作就是指具有原子性的操作。在objective-c 属性设置里面 默认的就是atomic ,意思就是 setter /getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于 函数头尾加了锁 . 这样的话并发访问性能会比较低。

nonatomic:非原子性,非原子操作 一般不需要多线程支持的时候就用它,这样在 并发访问的时候效率会比较高 . 在objective-c里面通常对象类型都应该声明为非原子性的. iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作. 如果在程序中 我们确定某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,但也可以设置成非原子性的,然后自己在程序中用加锁之类的来做数据同步。

总结:主要是在多线程下的区别。一般属性都声明为nonatomic,这样操作速度较快,但在多线程同时访问这一个属性的时候不安全,需要程序员自己加锁解锁。而atomic会自动生成加锁解锁的代码,多线程下相对安全。


2.readwrite:默认是可读可写的,可以用来赋值,也可以被赋值;

   readonly:只读,不生成setter方法,也就是不能被赋值。


3.assign:所有属性默认是assign,相当于weak,常用于各种基础数据类型。

应用举例:属性A被声明为assign或weak,可以理解为A不拥有某个对象或指针,所以一旦拥有该对象或指针的变量(或属性)被释放,A将会指向nil;

特殊应用:所有delegate的声明必须用weak。

   strong(retain):被声明的属性必须是objc对象,可以理解为拥有该对象的所有权。


4.copy:也是强引用(同strong、retain),被声明的属性必须是objc对象,并且要遵守NSCopying协议

应用:NSString类型要用copy。

猜你喜欢

转载自blog.csdn.net/ck_19900710/article/details/50780109