iOS

OC指示符assign、atomic、copy、retain、s

2019-04-02  本文已影响19人  青春的天空007

在使用@property定义property时可以在@property与类型之间用括号添加一些额外的指示符,常用的指示符有assign、atomic、copy、retain、strong、week、等。详情如下:

assign:该指示符号对属性只是简单的赋值,不更改引用计数。常用于NSInteger等OC基础类型,以及short、int、double、结构体等C数据类型,因为这些类型不存在被内存回收的问题。

atomic、nonatomic:指定setter和getter是否是原子操作,即是否线程安全。如果是atomic,那么存取方法都是线程安全的,即某一线程访问存或者取方法,其他线程不可以进入该存、取方法。nonatomic则不具备线程安全的功能。需要指出的是atomic是默认值,可以保证数据的完整性,但是相应的降低了性能,所以在单线程环境中建议使用nonatomic来提升性能。

copy:在改变原有对象的时候,不会改变新对象的值Copy:实现NSCopying协议,创建的是一个不可变副本;MutableCopy:实现NSMutableCopying协议,创建的是一个可变副本

getter、setter:用于为getter方法、setter方法指定自定义方法名。比如getter=myName, setter=setName:,我们可以看到setter方法后面有一个(:),这是因为我们需要在后面添加参数。

readonly、readwrite:readonly指示系统只合成getter方法,不合成setter方法;readwrite是默认值,指示系统需要合成setter方法和getter方法。

retain:当把某个对象赋值给该属性时,该属性原来所引用的对象的引用计数减1,被赋值对象的引用计数加1。在未启用ARC机制的的情况下,retain可以保证一个对象的引用计数大于1时,该对象不会被回收。启用ARC后一般较少使用retain

strong、weak:strong指示符该属性对被赋值对象持有强引用,而weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是:只要该强引用指向被赋值的对象,那么该对象就不会自动回收。弱引用的意思是:即使该弱引用指向被赋值的对象,该对象也可能被回收。如果不希望对象被回收,可以使用strong指示符。如果需要保证程序性能,避免内存溢出,可以使用weak,内存一旦被回收,指针会被赋值为nil。

unsafe_unretained:与weak不同,被unsafe_unretained指针所引用的对象被回收后,unsafe_unretained指针不会被赋为nil,可能会导致程序出错。

注:

1、atomic是默认行为,但因效率较高通常使用nonatomic,assign是默认行为,readwrite是默认行为

2、推荐做法是NSString使用copy

3、delegate用assign且一定要用assign

4、非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign)

5、其它objc类型,比如NSArray,NSDate用retain

上一篇下一篇

猜你喜欢

热点阅读