IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义
iOS 中 assign、retain、copy、weak、strong 的区别以及 nonatomic 的含义 iOS 中,在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong 中的一个,这些修饰符有什么区别?下面我们来详细介绍。 assign: assign 一般用来修饰基本的数据类型,包括基础数据类型(NSInteger、CGFloat)和 C 数据类型(int、float、double、char 等等)。assign 声明的属性是不会增加引用计数的,也就是说声明的属性释放后,就没有了,即使其他对象用到了它,也无法留住它,只会 crash。但是,即使被释放,指针却还在,成为了野指针,如果新的对象被分配到了这个内存地址上,又会 crash。所以一般只用来声明基本的数据类型,因为它们会被分配到栈上,而栈会由系统自动处理,不会造成野指针。 retain: retain 与 assign 相对,我们要解决对象被其他对象引用后释放造成的问题,就要用 retain 来声明。retain 声明后的对象会更改引用计数,那么每次被引用,引用计数都会+1,释放后就会-1,即使这个对象本身释放了,只要还有对象在引用它,就会持有,不会造成什么问题,只有当引用计数为 0 时,就被 dealloc 析构函数回收内存了。 copy: copy 最常见到的应该是 NSString。copy 与 retain 的区别在于 retain 的引用是拷贝指针地址,而 copy 是拷贝对象本身,也就是说 retain 是浅复制,copy 是深复制,如果是浅复制,当修改对象值时,都会被修改,而深复制不会。之所以在 NSString 这类有可变类型的对象上使用,是因为它们有可能和对应的可变类型如 NSMutableString 之间进行赋值操作,为了防止内容被改变,使用 copy 去深复制一份。copy 工作由 copy 方法执行,此属性只对那些实现了 NSCopying 协议的对象类型有效。 weak: weak 实际类似于 assign,叫弱引用,也是不增加引用计数。一般只有在防止循环引用时使用,比如父类引用了子类,子类又去引用父类。IBOutlet、Delegate 一般用的就是 weak,这是因为它们会在类外部被调用,防止循环引用。 strong: strong 相对的,strong 就类似于 retain 了,叫强引用,会增加引用计数,类内部使用的属性一般都是 strong 修饰的,现在 ARC 已经基本替代了 MRC,所以我们最常见的就是 strong 了。 nonatomic: 在修饰属性时,我们往往还会加一个 nonatomic,这又是什么呢?它的名字叫非原子访问。对应的有 atomic,是原子性的访问。我们知道,在使用多线程时为了避免在写操作时同时进行写导致问题,经常会对要写的对象进行加锁,也就是同一时刻只允许一个线程去操作它。如果一个属性是由 atomic 修饰的,那么系统就会进行线程保护,防止多个写操作同时进行。这有好处,但也有坏处,那就是消耗系统资源,所以对于 iPhone 这种小型设备,如果不是进行多线程的写操作,就可以使用 nonatomic,取消线程保护,提高性能。 我们可以看到 assign、retain、copy、weak、strong 和 nonatomic 这些修饰符的区别和用途,从而更好地使用它们来编写 iOS APP。
- 粉丝: 2
- 资源: 957
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助