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设置技巧与跨境访问优化指南
上一篇:yii2 如何配置
下一篇:如何在yii框架中使用gii
上一篇:yii2 如何配置
下一篇:如何在yii框架中使用gii

