atomic特质的局限性

leading-logo

为什么在实际的 Objective-C 开发中, 几乎所有的属性都声明为 nonatomic ? 声明为 atomic 的属性我是真的没见过

在实际的 Objective-C 开发中,大多数属性通常声明为 nonatomic,主要原因包括性能考虑和常见的设计模式。具体原因如下:

  1. 性能问题

    • atomic 属性的实现会在生成的 getter 和 setter 方法中加入锁机制,以确保操作的原子性。这会导致一定的性能开销,尤其是在高频率访问的场景中,性能损失更为明显。
    • nonatomic 属性的读写操作不需要加锁,因此在性能上比 atomic 更高效,特别是在需要高效数据访问的应用中,如 UI 操作或实时处理。
  2. 并发访问的复杂性

    • 即使将属性声明为 atomic,也只能保证单次读或写操作的原子性。大多数情况下,线程安全问题不仅仅是单次读写操作,而是涉及多个操作的组合。这种情况下,仅依赖 atomic 是不够的。
    • 开发者通常需要更高级的并发控制机制来确保线程安全,如使用锁、队列(GCD)、NSOperationQueue 等。这些机制提供了更细粒度的控制,能够处理更复杂的并发访问场景。
  3. 惯用设计模式

    • 许多 Objective-C 代码库和框架默认使用 nonatomic 属性,因为它们假定开发者会自行处理必要的线程安全控制。
    • 使用 nonatomic 属性可以使代码更加简洁,并且开发者可以根据需要灵活地选择适当的并发控制策略。
  4. UI 相关的属性

    • 在 iOS 开发中,大部分 UI 操作必须在主线程上执行,因此通常不需要 atomic 属性来保证线程安全。UI 相关的属性声明为 nonatomic 更为常见和合理。

示例

以下是一个常见的属性声明为 nonatomic 的例子:

@interface MyClass : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger count;
@end

线程安全的实现

为了实现更复杂的线程安全控制,开发者通常会这样做:

  1. 使用锁
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger count;
@property (nonatomic, strong) NSLock *lock;
@end@implementation MyClass
- (void)setName:(NSString *)name {[self.lock lock];_name = name;[self.lock unlock];
}- (NSString *)name {[self.lock lock];NSString *name = _name;[self.lock unlock];return name;
}
@end
  1. 使用 GCD
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger count;
@property (nonatomic, strong) dispatch_queue_t syncQueue;
@end@implementation MyClass
- (instancetype)init {self = [super init];if (self) {_syncQueue = dispatch_queue_create("com.example.MyClassSyncQueue", DISPATCH_QUEUE_SERIAL);}return self;
}- (void)setName:(NSString *)name {dispatch_sync(self.syncQueue, ^{_name = name;});
}- (NSString *)name {__block NSString *name;dispatch_sync(self.syncQueue, ^{name = _name;});return name;
}
@end

通过这些高级的并发控制机制,开发者可以确保属性的线程安全,而不需要依赖 atomic,同时还能避免其带来的性能损耗。

trailing-logo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核 2024/6/6 10:51 0、整体编译: 1、cat android12-rk-outside.tar.gz* | tar -xzv 2、cd android12 3、. build/envsetup.sh 4、lunch rk3588_s-userdebug 5、./build.sh -AUCKu -d rk3588-toybrick-x0-a…

Clo3D导出服装动画,使用Unity3D展示

1.前言 Clo3D是一款应用于时装行业的3D服装设计软件,其强大的布料模拟算法可在3D空间中实现设计、制版、试衣和走秀,大幅提升数字作品逼真度和制作效率。为了让服装动画效果展示在Unity3D上模拟效果,需要Clo3D模拟出逼着的衣服动画。总体流程为Clo3D - Mixamo -Blen…

登Cell Press子刊,武汉理工大学团队基于集成学习提出简化电化学模型,0.17s完成3500s的1C恒流放电

2022 年 7 月,不老男神林志颖突发车祸,作为专业赛车手的他驾驶的特斯拉 Model X 在行驶过程中忽然偏离既定轨迹,一头撞向路边的隔离带,随后车辆起火,并在救援车拖吊过程中二次起火,最终整辆车被烧到只剩下了…

Java心跳检测机制

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 心跳检测的定义 心跳检测是一种监控机制,在Java编程和分布式系统中具有广泛的应用。心跳检测,顾名思义,就像心跳一样,是一种…

【JS】理解闭包及其应用

历史小剧场 明朝灭亡,并非是简单的政治问题,事实上,这是世界经济史上的一个重要案例。 所谓没钱,就是没有白银。----《明朝那些事儿》 什么是闭包? 闭包就是指有权访问另一个函数作用域中变量的函数 闭包变量存储位置&…

Lidar3607.2 雷达点云数据处理软件新增功能介绍

新特性:预处理航带平差新增livox激光器镜面误差改正,新增多源航带平差,提升点云和影像匹配精度优化配准功能流程,ICP功能支持点云与模型配准安置检校新增轨迹自动裁剪轨迹解算时投影坐标增加Z值记录数据管理新增点云色彩亮度和对比度调节新增多段线平滑工…

Python中报错提示:TypeError: Student() takes no arguments

Python中报错提示:TypeError: Student() takes no arguments 在Python编程中,类是创建对象的蓝图。每个类都可能包含一个特殊的方法__init__,我们称之为构造函数,它在创建新实例时被调用。如果你在尝试创建一个类的实例时遇到了Ty…

【SpringCloud学习笔记】Docker(中篇)

Docker 1. 自定义镜像 前面我们都是使用docker pull拉取仓库中现成的镜像,但是如果我们想要将一个Java应用程序构建成镜像然后部署应该怎么做呢?这个时候我们就需要自定义镜像了 **镜像:**本质上就是一堆文件的集合,包含了应用程…

【清华大学】《自然语言处理》(刘知远)课程笔记 ——NLP Basics

自然语言处理基础(Natural Language Processing Basics, NLP Basics) 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…

临床应用的深度学习在视网膜疾病的诊断和转诊中的应用| 文献速递-视觉通用模型与疾病诊断

Title 题目 Clinically applicable deep learning for diagnosis and referral in retinal disease 临床应用的深度学习在视网膜疾病的诊断和转诊中的应用 01 文献速递介绍 诊断成像的数量和复杂性正在以比人类专家可用性更快的速度增加。人工智能在分类一些常见疾病的二…

【Node.js快速部署opencv项目】图像分类与目标检测

⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…

高考之后第一张大流量卡应该怎么选?

高考之后第一张大流量卡应该怎么选? 高考结束后,选择一张合适的大流量卡对于准大学生来说非常重要,因为假期期间流量的使用可能会暴增。需要综合考虑多个因素,以确保选到最适合自己需求、性价比较高且稳定的套餐。以下是一些建议…

Linux——PXE整体流程

1.自己安装一个CentOS 8的服务器 1)手动安装 虚拟硬件配置:2核CPU,4G内存,100G硬盘 2个网卡(一个通外网,一个内部使用) 软件安装:Server GUI 磁盘分区:使用逻辑卷&#…

Django API开发实战:前后端分离、Restful风格与DRF序列化器详解

系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游&#xff…

中心极限定理的MATLAB例

独立同分布的中心极限定理: 设 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1​,X2​,…,Xn​ 是独立同分布的随机变量序列,且 E ( X i ) μ E(X_i) \mu E(Xi​)μ, D ( X i ) σ 2 > 0 D(X_i) \sigma^2 > 0 D(Xi​)σ2>0&a…

《C++ Primer Plus》第十三章复习题和编程练习

目录 一、复习题**二、编程练习 一、复习题** 1. 派生类从基类那里继承了什么? 答:在类的继承和派生中,C中的派生类能够继承基类的所有数据成员和大部分成员函数。但是基类中不同访问控制权限的成员在派生中的访问权限也不相同。公有成员直…

陆面生态水文模拟与多源遥感数据同化技术

原文链接:陆面生态水文模拟与多源遥感数据同化技术 了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用;熟悉模 型的发展历程,常见模型及各自特点;理解Noah-MP模型的原理,掌握Noah-MP 模型在单 站和区域的模拟、模拟结果的…

如何将AndroidStudio和IDEA的包名改为分层级目录

新版UIAndroidStudio 1、点击项目目录右上角如图所示的三个点点。 2、然后依次取消Hide empty middle package ,Flatten package的勾选 3、注意:一定要先取消hide的勾选,不然目录不会完全分级(做错了可以反过来重新设置&#x…

物资材料管理系统建设方案(Word)—实际项目方案

二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 4.4.11.7 非功能性需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口…

物联网8大协议介绍及对比

一.物联网主流协议介绍 1.MQTT 协议 MQTT(Message Queuing Telemetry Transport)即消息队列遥测传输。 MQTT 协议最初是在 1999 年由 IBM 公司开发的,用于将石油管道上的传感器与卫星相连接。2014 年正式成为 OASIS 开放标准。 MQTT 使用…