IOS ARC和GCD结合的单例模式

SpringBoot核心知识点深度梳理:自动配置、启动流程与Bean生命周期 在Java后端开发中,SpringBoot的自动配置与条件装配机制是提升开发效率的关键。其原理基于约定优于配置,通过条件注解动态加载Bean,实现依赖的自动管理。理解这些机制不仅能优化应用启动性能,还能有效解决配置不生效、循环依赖等常见问题。在微服务架构和快速迭代场景下,掌握SpringBoot底层逻辑有助于精准排查故障,提升系统稳定性。本文深入剖析自动配置、启动流程及Bean生命周期等核心知识点,结合实战经验,帮助开发者从会用进阶到理解。 阅读详情

单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法:

  1. static MyGizmoClass *sharedGizmoManager = nil;  
  2.    
  3. + (MyGizmoClass*)sharedManager  
  4. {  
  5.     @synchronized(self) {  
  6.         if (sharedGizmoManager == nil) {  
  7.             [[self alloc] init]; // assignment not done here  
  8.         }  
  9.     }  
  10.     return sharedGizmoManager;  
  11. }  
  12.    
  13. + (id)allocWithZone:(NSZone *)zone  
  14. {  
  15.     @synchronized(self) {  
  16.         if (sharedGizmoManager == nil) {  
  17.             sharedGizmoManager = [super allocWithZone:zone];  
  18.             return sharedGizmoManager;  // assignment and return on first allocation  
  19.         }  
  20.     }  
  21.     return nil; //on subsequent allocation attempts return nil  
  22. }  
  23.    
  24. - (id)copyWithZone:(NSZone *)zone  
  25. {  
  26.     return self;  
  27. }  
  28.    
  29. - (id)retain  
  30. {  
  31.     return self;  
  32. }  
  33.    
  34. - (unsigned)retainCount  
  35. {  
  36.     return UINT_MAX;  //denotes an object that cannot be released  
  37. }  
  38.    
  39. - (void)release  
  40. {  
  41.     //do nothing  
  42. }  
  43.    
  44. - (id)autorelease  
  45. {  
  46.     return self;  
  47. }  

现在iOS5之后普遍使用了ARC技术,原来这个写法就显得很累赘了,release已经不使用了。

咱们可以结合GCD来实现单例模式:

  1. + (id)sharedInstance  
  2. {  
  3.   static dispatch_once_t pred = 0;  
  4.   __strong static id _sharedObject = nil;  
  5.   dispatch_once(&pred, ^{  
  6.     _sharedObject = [[self alloc] init]; // or some other init method  
  7.   });  
  8.   return _sharedObject;  
  9. }  
使用dispatch_once,这个方法的意思是在应用程序生命周期内,这方法只执行一次,这就是ARC下结合GCD的一个单例的代码

因为我们可能需要多个单例的类,每个都写一次比较麻烦,可以更方便一些,把这些代码写成宏的形式,只需要传入类名就可以创建一个单例的类了。

通过传入类名创建头文件中单例方法的名称:

  1. #define DEFINE_SINGLETON_FOR_HEADER(className) \  
  2. \  
  3. + (className *)shared##className;  


通过传入类名创建单例方法的实现
  1. #define DEFINE_SINGLETON_FOR_CLASS(className) \  
  2. \  
  3. + (className *)shared##className { \  
  4. static className *shared##className = nil; \  
  5. static dispatch_once_t onceToken; \  
  6. dispatch_once(&onceToken, ^{ \  
  7. shared##className = [[self alloc] init]; \  
  8. }); \  
  9. return shared##className; \  
  10. }  

使用宏:

在项目中新建了一个类testSingleton,并且有.h 和.m文件。

.h

.m中的代码:

  1. #import "testSingleton.h"  
  2.   
  3. @implementation testSingleton  
  4. DEFINE_SINGLETON_FOR_CLASS(testSingleton)  
  5. @end  

  1. #define DEFINE_SINGLETON_FOR_HEADER(className) \  
  2. \  
  3. + (className *)shared##className;  
  4.   
  5. #define DEFINE_SINGLETON_FOR_CLASS(className) \  
  6. \  
  7. + (className *)shared##className { \  
  8. static className *shared##className = nil; \  
  9. static dispatch_once_t onceToken; \  
  10. dispatch_once(&onceToken, ^{ \  
  11. shared##className = [[self alloc] init]; \  
  12. }); \  
  13. return shared##className; \  
  14. }  
  15.   
  16. #import <Foundation/Foundation.h>  
  17.   
  18. @interface testSingleton : NSObject  
  19. DEFINE_SINGLETON_FOR_HEADER(testSingleton);  
  20. @end  
你可以把宏单独放到项目管理宏的文件中。这里是为了方便演示放到和testSingleton.h文件了。
获取单例:
  1. - (void)test  
  2. {  
  3.     testSingleton *testShare = [testSingleton sharedtestSingleton];  
  4. }  

有什么不明白的可以留言交流。

Objective-C学习之创建单例 iOS 创建单例的两种方法IOS实现单例模式的几种实现方法ios开发单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式 阅读详情

相关推荐

【高低温试验】试验报告模板

高低温循环试验,验证被测设备(DUT)在极端高温、低温环境下的性能稳定性、功能可靠性及安全性,确保其符合设计规范和相关标准(如GB/T 2423.1、GB/T 2423.2)。:验证设备在剧烈温度变化下的耐受能力(如-40℃↔+85℃,温变速率≥10℃/min)。低温测试标准:GB/T 2423.2-2008(温度-40℃,保持时间4小时):模拟高温高湿环境(如温度+60℃,湿度95%RH),测试防潮性能。

电路巫师把一切不可能变成不可能 1565

Objective-C在ARC下结合GCD的单例模式和宏模版

单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法: [cpp] view plaincopy static MyGizmoClass *sharedGizmoManager = nil;     + (MyGizmoClass*)sharedManager  {      @synchronized(self) {

程序人生 1892

AI赋能软件测试:从冒烟测试到全流程智能化的效率革命

软件测试是确保软件质量的关键环节,其核心原理是通过预设用例验证系统功能是否符合预期。传统测试方法依赖人工编写和维护脚本,面临维护成本高、适应性差等挑战。随着人工智能技术的发展,特别是自然语言处理和计算机视觉的成熟,AI为测试领域带来了新的技术价值。通过让AI理解应用界面和业务逻辑,可以实现测试用例的智能生成、自主执行和结果分析,显著提升测试效率和覆盖率。在实际应用场景中,AI驱动的冒烟测试能够动态适应UI变化,自动分析失败日志,将测试人员从重复劳动中解放出来,专注于更复杂的质量策略设计。本文基于AI在冒烟测

weixin_28841265的博客 306

(C++)用模板或宏实现单例模式

在cocos2d-x开发中经常会用到单例模式,而每个单例模式类实际上具备相似的基础结构,为了便于快速写出一个具有单例模式的类,可以借助模板或者宏。 1.单例模式的类实现 2.单例模式的模板实现 3.单例模式的宏实现 4.三种实现方式的分析 5.总结

nono_o的专栏 3585

ConnectionResetError 10054 根因分析与全链路防御指南

ConnectionResetError(错误码10054)是TCP协议中服务端主动发送RST包导致的强制断连,本质并非网络连接失败,而是服务端基于空闲超时、连接满载、TLS协商失败等策略做出的确定性终止决策。理解其底层原理有助于跳出‘重试’误区,转向连接生命周期管理。该错误高频出现在HTTP长连接、WebSocket、第三方API对接等场景,尤其在Nginx反向代理、负载均衡器(如AWS ALB)、WAF设备及内核conntrack机制下极易触发。本文结合Wireshark抓包分析、客户端心跳保鲜、协议指

weixin_30225755的博客 639

ubuntu20.04 终端安装claude

【代码】ubuntu20.04 终端安装claude。

hongliyu_lvliyu的博客 2594

单例的模版+宏的实现

下面,对 单例的模版实现 使用宏进一步简化。 Singleton.h 在 Singleton.h 的最后面添加宏 SINGLETON #ifndef SINGLETON_H #define SINGLETON_H #include #include template typename T> class Singleton { public: static T& getInst

奋斗Andy的博客 1030

智能车学习日记【二】————十字和斜入十字

智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可

bsefef的博客 2740

单例宏

#define singleH(name) +(instancetype)share##name; #if __has_feature(objc_arc) #define singleM(name) static id _instance;\ +(instancetype)allocWithZone:(struct _NSZone *)zone\ {\ static dispatch_

walkmanaky的博客 272

YOLOv8改进策略【注意力机制篇】| CVPRW-2024 分层互补注意力混合层 H-RAMi 针对低质量图像的特征提取模块

许多证据表明层次化网络对图像恢复(IR)任务通常不太有效,因为IR的目标是逐个预测像素值(密集预测),而缩小特征图会丢失重要的像素级信息。然而,层次化结构有降低时间复杂度以及学习语义级和像素级特征表示的优点。为了弥补缺点并利用优点,设计了H - RAMi层。

Limiiiing的博客 378

【CloudCompare】Windows源码编译CloudCompare

本文详细介绍了在Windows环境下编译安装CloudCompare V2.12.0的过程。首先配置了PCL 1.14.1、CMake 3.30.6和QT 5.14.2开发环境,使用Visual Studio 2022工具集。然后下载源码并通过CMake进行配置,特别注意勾选PLUGIN_STANDARD_QPCL以支持PCD文件加载。最后在VS2022中编译安装,并指出Debug模式下可能遇到的VTK库后缀问题,需添加CMAKE_DEBUG_POSTFIX变量解决。整个流程涵盖了从环境搭建到最终编译成功的

yijiujiusan的博客 486

ARC环境下两种单例设计模式的比较:GCD和同步锁

A. 单例模式的设计思路: (1)永远只分配一块内存来创建对象; (2)提供一个类方法,返回内部唯一的实例; (3)确保 init 方法只初始化一次; (通常采用懒加载的方式在第一次用到实例的时候再去创建它。) B. 单例模式的作用 : 可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。

HenryZhang的博客 721

无刷电机里的霍尔传感器,和 AS5600 编码器到底有什么区别?

摘要: 无刷电机中的霍尔传感器主要用于换相控制,提供6种状态反馈,无法实现精确角度测量。与AS5600磁编码器(分辨率4096)相比,霍尔仅能确保电机“转得对”,而编码器则用于高精度角度反馈。在机器人等需要位置闭环的场景中,两者需协同使用:霍尔负责基础换相,编码器提供精确角度控制。简单应用中可仅用霍尔,但高精度定位必须搭配编码器。

qq_45430571的博客 242

ios开发单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式

使用GCD和线程锁实现单例模式 static dispatch_once_t once; dispatch_once(&once,^{ } @synchronized(self)

Walden_tinghou的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

17、Objective-C在ARC下结合GCD的单例模式和宏模版

单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法: [cpp] view plaincopy static MyGizmoClass *sharedGizmoManager = nil;       + (MyGizmoClass*)sharedManager   {       @synchron

zwcshy的专栏 582

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

iOS单例模式实现

参考文章: 1、http://beyondvincent.com/blog/2013/05/09/20/ 2、《ios设计模式解析》 iOS中,单例模式的实现方式一般有两种:Non-ARC(非ARC)和ARC+GCD (建议采用ARC+GCD模式) (一)Non-ARC实现方法如下: SYWNonARCSingleton.h #import

sun_yang2008的专栏 453

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ios单例的实现

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 这里主要介绍下在arc下,利用gcd实现单例。 第一步:声明一个静态实例 static SoundTool *_instance; 第二步:重写初始化方法 + (id)allocWithZone:(struct _NSZone *)zone 在对象初始化分配内存...

weixin_34309435的博客 94
上一篇: IOS5.0 系统中 跳转至设置项的各种url链接
下一篇: iphone 上面一维码,二维码 zxing,zbar 最终乱码解决问题
seraph2012
博客等级 码龄16年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值