IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义

 更新时间:2017年03月08日 14:49:20   投稿:lqh  
这篇文章主要介绍了我们在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong中的一个,他们的区别,需要的朋友可以参考下

IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义

我们在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong中的一个,很多时候,我们仅仅只是按照习惯去写经常写的那一个,但有时候看代码时又会发现别人用的不尽相同,那这些之间的区别是什么呢?

首先,上面五个并不是在一个层面上的,可以分为两部分,第一部分是assign、retain、copy,第二部分是weak、strong。

我们先说第一部分的assign、retain、copy。

assign:

assign一般用来修饰基本的数据类型,包括基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等),为什么呢?assign声明的属性是不会增加引用计数的,也就是说声明的属性释放后,就没有了,即使其他对象用到了它,也无法留住它,只会crash。但是,即使被释放,指针却还在,成为了野指针,如果新的对象被分配到了这个内存地址上,又会crash,所以一般只用来声明基本的数据类型,因为它们会被分配到栈上,而栈会由系统自动处理,不会造成野指针。

retain:

与assign相对,我们要解决对象被其他对象引用后释放造成的问题,就要用retain来声明。retain声明后的对象会更改引用计数,那么每次被引用,引用计数都会+1,释放后就会-1,即使这个对象本身释放了,只要还有对象在引用它,就会持有,不会造成什么问题,只有当引用计数为0时,就被dealloc析构函数回收内存了。

copy:

最常见到copy声明的应该是NSString。copy与retain的区别在于retain的引用是拷贝指针地址,而copy是拷贝对象本身,也就是说retain是浅复制,copy是深复制,如果是浅复制,当修改对象值时,都会被修改,而深复制不会。之所以在NSString这类有可变类型的对象上使用,是因为它们有可能和对应的可变类型如NSMutableString之间进行赋值操作,为了防止内容被改变,使用copy去深复制一份。copy工作由copy方法执行,此属性只对那些实现了NSCopying协议的对象类型有效 。

以上三个可以在MRC中使用,但是weak和strong就只能在ARC中使用,也就是自动引用计数,这时就不能手动去进行retain、release等操作了,ARC会帮我们完成这些工作。

weak:

weak其实类似于assign,叫弱引用,也是不增加引用计数。一般只有在防止循环引用时使用,比如父类引用了子类,子类又去引用父类。IBOutlet、Delegate一般用的就是weak,这是因为它们会在类外部被调用,防止循环引用。

strong:

相对的,strong就类似与retain了,叫强引用,会增加引用计数,类内部使用的属性一般都是strong修饰的,现在ARC已经基本替代了MRC,所以我们最常见的就是strong了。

nonatomic:

在修饰属性时,我们往往还会加一个nonatomic,这又是什么呢?它的名字叫非原子访问。对应的有atomic,是原子性的访问。我们知道,在使用多线程时为了避免在写操作时同时进行写导致问题,经常会对要写的对象进行加锁,也就是同一时刻只允许一个线程去操作它。如果一个属性是由atomic修饰的,那么系统就会进行线程保护,防止多个写操作同时进行。这有好处,但也有坏处,那就是消耗系统资源,所以对于iPhone这种小型设备,如果不是进行多线程的写操作,就可以使用nonatomic,取消线程保护,提高性能。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Xcode9项目上传到GitHub教程

    Xcode9项目上传到GitHub教程

    本篇文章给大家分享一下在IOS中如何将Xcode9项目上传到GitHub的教程方法,一起跟着学习分享下吧。
    2018-01-01
  • iOS屏幕适配开发实用技巧

    iOS屏幕适配开发实用技巧

    这篇文章主要为大家详细介绍了iOS屏幕适配开发实用技巧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 关于iOS获取属性你真的了解吗?

    关于iOS获取属性你真的了解吗?

    这篇文章主要给大家介绍了关于iOS取属性的相关资料,当说到取属性,相信很多的iOS开发者们会说出很多,但你就真的理解吗?下面就来详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • iOS实现播放远程网络音乐的核心技术点总结

    iOS实现播放远程网络音乐的核心技术点总结

    本篇文章主要介绍了iOS播放远程网络音乐的核心技术,采用ios系统自带的AVFoundation框架来实现,有需要的朋友可以了解一下。
    2016-11-11
  • iOS利用Block逆向传值的方式详解

    iOS利用Block逆向传值的方式详解

    大家应该都有所了解在iOS开发中,常见的几种逆向传值方式,有代理(delegate)、通知(NSNotification),block等等,之前已经给大家介绍了通过代理实现逆向传值的方法,这篇文章来给大家介绍如何通过Block进行逆向传值,有需要的朋友们下面跟着小编一起来学习学习吧。
    2016-12-12
  • iOS中tableView cell分割线的一些设置技巧

    iOS中tableView cell分割线的一些设置技巧

    在项目开发中我们会常常遇到tableView 的cell分割线显示不全,左边会空出一截像素,更有甚者想改变系统的分割线,下面通过这篇文章来一起学习学习在iOS中tableView cell分割线的一些设置技巧,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • iOS实现圆角箭头视图

    iOS实现圆角箭头视图

    这篇文章主要为大家详细介绍了iOS实现圆角箭头视图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • OpenCV  iOS 图像处理编程入门详细教程

    OpenCV  iOS 图像处理编程入门详细教程

    这篇文章主要介绍了OpenCV iOS 图像处理编程入门,OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等,对于图像处理、人机交互及机器学习算法感兴趣的可以选择一个方向进行深入的研究
    2022-07-07
  • iOS DropDown下拉按钮效果代码分享

    iOS DropDown下拉按钮效果代码分享

    这篇文章主要为大家详细介绍了iOS DropDown下拉按钮效果的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 基于ios逆向过程中lldb调试技巧(推荐)

    基于ios逆向过程中lldb调试技巧(推荐)

    下面小编就为大家带来一篇基于ios逆向过程中lldb调试技巧(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论