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

发布时间 - 2026-01-11 00:04:12    点击率:

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,取消线程保护,提高性能。

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


# iOS中assign、retain、copy、weak、strong的区别以及nonatomic的含  # iOS  # assign、retain、copy、weak、  # iOS 各种修饰符的区别汇总(推荐)  # iOS开发技巧之WeakSelf宏的进化详解  # iOS 中weak的实现代码示例  # iOS开发技能weak和strong修饰符的规范使用详解  # 就会  # 什么呢  # 子类  # 又会  # 第一部分  # 多线程  # 都是  # 也就是说  # 是在  # 也有  # 是因为  # 还在  # 多个  # 有可能  # 是由  # 还会  # 会在  # 要在  # 就没  # 作了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: phpredis提高消息队列的实时性方法(推荐)  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  PHP 500报错的快速解决方法  北京专业网站制作设计师招聘,北京白云观官方网站?  EditPlus中的正则表达式 实战(1)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何处理表单验证?(Requests代码示例)  Laravel如何使用Vite进行前端资源打包?(配置示例)  再谈Python中的字符串与字符编码(推荐)  智能起名网站制作软件有哪些,制作logo的软件?  如何自定义建站之星网站的导航菜单样式?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  微信小程序 require机制详解及实例代码  音乐网站服务器如何优化API响应速度?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  如何正确下载安装西数主机建站助手?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何挑选最适合建站的高性能VPS主机?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  黑客入侵网站服务器的常见手法有哪些?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何用景安虚拟主机手机版绑定域名建站?  Laravel如何使用Collections进行数据处理?(实用方法示例)  香港服务器选型指南:免备案配置与高效建站方案解析  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在阿里云域名上完成建站全流程?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Linux系统命令中screen命令详解  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Linux系统命令中tree命令详解  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南