首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Apple建议使用dispatch_once在ARC下实现单例模式?

在ARC(Automatic Reference Counting)下实现单例模式时,Apple建议使用dispatch_once的主要原因是确保线程安全和性能优化。

  1. 线程安全:dispatch_once函数能够保证在多线程环境下只执行一次,避免了多线程竞争条件下创建多个实例的问题。在单例模式中,如果多个线程同时调用创建实例的方法,使用dispatch_once可以确保只有一个线程能够成功创建实例,避免了线程安全问题。
  2. 性能优化:使用dispatch_once可以在创建实例时提供更好的性能。它利用了GCD(Grand Central Dispatch)的特性,使用了一种优化的算法,确保只有在第一次调用时才会执行创建实例的代码。之后的调用都会直接返回已创建的实例,避免了重复创建实例的开销。

总结起来,使用dispatch_once在ARC下实现单例模式能够保证线程安全,并提供更好的性能。这对于需要在多线程环境下使用单例模式的应用场景非常重要。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS-模式写一次就够了

模式简介 模式的作用 可以保证程序运行过程,一个类只有一个实例,而且该实例易于供外界访问 从而方便地控制了实例个数,并节约系统资源 模式使用场合 整个应用程序中,共享一份资源(这份资源只需要创建初始化...ARC中的实现 ARC实现步骤 1 类的内部提供一个static修饰的全局变量 2 提供一个类方法,方便外界访问 3 重写+allocWithZone方法,保证永远都只为对象分配一次内存空间...一劳永逸,模式的优化 如果想要一劳永逸,我们将面临两个问题 1:如何写一份代码ARC和MRC环境都适用?...2:如何使一份代码可以多个类共同使用 为了解决这两个问题,我们可以PCH文件使用代参数的宏和条件编译 利用条件编译来判断是ARC还是MRC环境 #if __has_feature(objc_arc...) //如果是ARC,那么就执行这里的代码1 #else //如果不是ARC,那么就执行代理的代码2 #endif 注意:模式不可以使用继承,因为使用继承,同时也会继承静态变量,当子类和父类同时创建的时候只会创建一个先创建的实例对象

1.4K50

对象

开发中经常需要使用对象。...今天主要说的是宏 首先先简单介绍一 1.设计模式(Singleton) 1> 什么: 它可以保证某个类创建出来的对象永远只有1个 2> 作用(为什么要用) * 节省内存开销 * 如果有一些数据..., 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的) * 一般来说, 工具类设计为模式比较合适 3> 怎么实现 * MRC(非ARC) * ARC 代码采用的是mrc...的环境 单独创建一个.h文件 例如SingleTon.h 1 //帮助实现设计模式 2 /* 3 alloc方法内部会调用allocWithZone 4 */ 5 6 #define...instancetype)shared##methodName\ 61 {\ 62 return [[self alloc]init];\ 63 } 64 65 #endif \代表的含义是说:下一行属于它   然后使用的时候

57780

iOS - ARC与MRC的设计模式

设计模式(Singleton) �定义 就是保证某个类创建出来的对象从始到终只有一个的一种方案 作用 节省内存开销 保证整个程序中使用同一份资源 实现 首先将我们的环境设置为非ARC环境,即MRC,...MRC环境 MRC模式,我们得自己手动释放资源,所以得重写一些与资源创建与释放相关的方法,以保证对象的唯一。...那现在来看看ARC是如何实现的吧。其实ARC与MRC的区别就是ARC我们不用自己再手动去释放资源了,从而使代码上大同小异,如下所示。...现在我们已经知道了ARC与MRC分别是如何创建的了,但是如果我们一个项目里需要多个,那我们只能把代码复制粘贴再改改就完事吗?...我们只要创建一个类,然后.h文件中写SingletonH(XXX),再在.m文件中写SingletonM(XXX)就可以实现了~ 指定环境 顺便提下如何在MRC指定某个类文件使用的环境为ARC

57330

iOS小技能: static、extern 存储类的应用(创建共享实例、申明公共方法、全局字符串常量)

使用static结合线程安全模式dispatch_once来创建共享实例,并使用条件编译#if进行ARC、MRC的适配。...使用extern申明公共方法、全局字符串常量 I 使用static结合线程安全模式来创建共享实例 对象应该使用线程安全模式来创建共享实例。...https://kunnan.blog.csdn.net/article/details/105202605 1.2 模式的基本实现 一个类只有一个对象 /** 模式:一个类只有一个对象...GCD结合宏来实现 使用static结合线程安全模式dispatch_once来创建共享实例,并使用条件编译#if进行ARC、MRC的适配。...缺点:宏定义的代码不好调试 2.1 ARC 环境的GCD实现 /* GCD 实现 */ static id _dataTool; + (instancetype)shareDataTool{

86130

浅析设计模式

开发中经常会用到设计模式,目的就是为了程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放。保证一个类仅有一个实例,并提供一个访问它的全局访问点。...方式三 另外,除了使用一次性代码dispatch_once保证多线程情况获取的仍然是同一个对象,我们还可以使用同步锁的方式达到这个目的,代码如下: + (instancetype)shareInstance...方式四 当然还可以的全局访问点(类方法)中使用同步锁,其结果和方式二是一样的:外部都不能直接通过调用[[class alloc] init]方法来获取,代码如下: + (instancetype...此处以利用dispatch_once一次性代码 + 宏定义的方式抽取出一个通用的宏,其实在网上随便一搜,就可以搜到一大把宏。...类(拿Person类为)中导入这个头文件。

7.1K20

你真的能写好一个么?

可能是 iOS 开发者最熟悉设计模式之一了。 我们的项目里头也使用了很多。 最近为了解决项目中的 bug 而花费了两天多的时间,发现用 ObjC 写好一个真的不容易!...苹果网站上, 曾经有一份OC实现的 sample code(现在没有了,链接失效了, 现在只有 swift 的, 毕竟现在的小甜甜是 swift)。...原来项目中有继承的情况(关于是否可以继承, 以及什么场景继承, 这是另外一个争论话题~)。...V4.0 我们项目中, 为了减少重复代码, 把实现写成一个模板, 只需要把这个宏添加到类实现中, 就能把这个类变成单。详情可以参考我很久很久以前的文章。 如何保证初始化方法不可重入呢?...【可选】继承,weak 模式还需要另外考虑。

90500

你真的能写好一个么?

我们的项目里头也使用了很多?。 最近为了解决项目中的 bug 而花费了两天多的时间,发现用 ObjC 写好一个真的不容易!...苹果网站上, 曾经有一份OC实现的 sample code(现在没有了,链接失效了, 现在只有 swift 的, 毕竟现在的小甜甜是 swift)。...原来项目中有继承的情况?(关于是否可以继承, 以及什么场景继承, 这是另外一个争论话题~)。...4 我们项目中, 为了减少重复代码, 把实现写成一个模板, 只需要把这个宏添加到类实现中, 就能把这个类变成单。详情可以参考我很久很久以前的文章。 如何保证初始化方法不可重入呢?...【可选】继承,weak 模式还需要另外考虑。

35810

的必要认识(深刻理解)

最近我面试人家,问他对的认识,他对的基本认识、创建方式回答全对,只有一点吞吞吐吐。 的认识 模式模式是设计模式中最简单的形式之一。...: 显然模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。...2.模式的优点: 1.安全性和唯一性:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。...,全局唯一 扩展二:(宏定义) 作用:有时项目中需要创建好多个,把的代码定义为宏,则可以省去重复代码,节省时间。.../** * .h文件中定义的宏,arc * * DWSingletonH(classname, accessorMethodName) 这个是宏 * 在外边我们使用 “DWSingletonH

374100

dispatch_once造成的死锁

好久没有更新了,这一次遇到一个模式造成的死锁,比较有代表性,这里做一个总结,分享给大家 起初,我们发现程序偶现死锁的问题, 按照解决deadlock的一般思路 是找到问题发生时,访问同一资源或者数据结构的可疑线程...那这里会不会有问题呢 这里有一个关键的信号量,dispatch_once,会对后面的任务进行堵塞 Apple对于dispatch_once的源码地址 简化实现的原理是: 1、dispatch_once...执行期间,多次进入调用同类的dispatch_once函数(即函数),会导致整体链表增长。...至于为什么 [NSNotificationCenter postNotificationName:object:userInfo:] 会同步等待主线程返回,猜测苹果自己实现中接收通知是这样做的,要求接收通知的...NSLog(@"Notification %@", ns); }]; 问题找到了,解决方案也比较简单,无非两种,一种是不允许子线程访问CTTelephonyNetworkInfo方法,一种是不使用的方式

90410

设计模式(五): 简单而又不失其重要性的模式(Singleton Pattern)

之前的博客《Objective-C中的模式》中介绍了Objective-C中MRC和ARC模式。...,在用户登录你的应用后,你要存储一用户的基本信息对吧,此时将用户的基本信息放在中是比较合适的。因为在这种场景,当前登录的用户只有一个,而且需要信息统一,所以我们需要使用实现。...Swift中实现也是比较简单的,同样你可以使用GCD进行的创建也可以使用静态方法和静态属性来实现。因为今天博客中的代码所涉及的内容只有一个类,在此就不做类图了。...一、使用GCD实现 GCDSwift中用着也是非常爽的,下方代码段是使用GCD中的dispatch_once实现的,使用方法可OC一直。...二、使用静态私有常量和静态方法来实现 如果你感觉使用dispatch_once来创建有些麻烦的话,那么你可以通过静态方法来返回静态私有常量的形式来创建

58850

浅谈Objective-C设计模式(Design Pattern)import Singleton.h

Sington() Notification(通知)机制 block(回调) 何为模式:一个类系统中只有一个实例对象。通过全局的一个入口点对这个实例对象进行访问。...整个应用或系统只能有该类的一个实例 模式静态类图: 技术要点: 1、某个类只能有一个实例 2、它必须自行创建这个实例 3、它必须向整个系统提供这个实例 何时使用模式: 1、只能共享而不能复制的资源...Objective-C中实现模式: 1、如何保证类只创建一个实例?因为OC中所有方法都是共有的。...执行该任务指定的代码块,该代码块中实例化上文声明的类变量 返回整个应用的生命周期中只会被实例化一次的变量 Cocoa Touch框架中使用模式:举例如下: 1、UIApplication...工厂模式总结: 应用场景: 1.设计的初期,就考虑到产品在后期会进行大规模扩展的情况,应当使用工厂方法模式; 2.产品结构较复杂的情况建议使用工厂方法模式; 3.工厂方法模式适用于产品种类结构单一的场合

67170

Objective-C中的模式

不过23种设计模式里面模式还是算比较好理解的, 那么OC中又是怎么来表示模式的呢?下面会结合着代码,理解一OC中得模式。     ​    ​...首先得了解什么是模式,用大白话说,模式就是程序中这个类只对应着一个实例,这就是模式模式一般用全局静态对象来实现。...下面我们会建立一个生成单的类SingletonClass,实现文件中定义各种方法来实现我们的模式。     ​    ​...1.模式一般用全局静态对象来实现,所以我们SingletonClass.m中定义一个静态全局变量是少不了的 1 2 //定义静态全局变量 static SingletonClass *single...上面是ARC模式下得模式,那么ARC模式我们应如何实现我们的模式呢,我们下面就会给出ARC模式,用下面的方法,因没有重写alloc,copy等方法,通过alloc还是可以给该对象分配一个新对象的

1.8K70

备战九十,iOS面试题菜单,持续更新(题目及答案已上传Github)

autoreleasePool 何时被释放? 解释一 事件响应 的过程? 解释一 手势识别 的过程? 解释一 GCD Runloop 中的使用? 解释一 NSTimer。...Category 和 Extension 有什么区别 说一 Method Swizzling? 说一实际开发中你什么场景使用过? 如何实现动态添加方法和属性?...dispatch_once实现 NSOperationQueue的优点 NSOperation和NSOperationQueue NSThread+runloop实现常驻线程 自旋锁与互斥锁 内存管理...(戳这里跳转到Github) 内存布局 内存管理方案 MRC(手动引用计数)和ARC(自动引用计数) 循环引用 讲一 iOS 内存管理的理解 使用自动引用计数应遵循的原则 ARC自动内存管理的原则...为什么已经有了 ARC ,但还是需要 @AutoreleasePool 的存在? __weak 属性修饰的变量,如何实现在变量没有强引用后自动置为 nil ?

1.3K00

“赢”战2020!阿里、字节:一套高效的iOS面试真题!

关联对象如何实现weak属性 Autoreleasepool的原理?所使用的的数据结构是什么 ARC实现原理?...ARC对retain & release做了哪些优化 ARC哪些情况会造成内存泄漏 其他 Method Swizzle注意事项 属性修饰符atomic的内部实现是怎么样的?...分别对比 GCD有哪些队列,默认提供哪些队列 GCD有哪些方法api GCD主线程 & 主队列的关系 如何实现同步,有多少方式就说多少 dispatch_once实现原理 什么情况会死锁 有哪些类型的线程锁...AppStore安装app时的认证流程 开发者怎么debug模式把app安装到设备呢 架构设计 典型源码的学习 只是列出一些iOS比较核心的开源库,这些库包含了很多高质量的思想,源码学习的时候一定要关注每个框架解决的核心问题是什么...常见的设计模式 的弊端 常见的路由方案,以及优缺点对比 如果保证项目的稳定性 设计一个图片缓存框架(LRU) 如何设计一个git diff 设计一个线程池?

1.1K31

iOS设计模式系列:设计模式

设计模式从字面意思上来说,就是一个类系统运行时,只创建一个实例。可以用于需要被多次调用的或者多次使用的资源中。比如我们常见的网络请求类、工具类等等。...二、的要点 该类有且只有一个实例 该类必须能自行创建这个实例 该类必须能够向整个系统提供这个实例 三、的优缺点 优点: 提供了唯一实例的受访对象 因为系统中只存在一个实例,频繁访问和调用时,...因为化的类,控制了实例化的过程,所以能更灵活修改实例化的过程。 缺点: 模式没有抽象层,不容易扩展。 模式往往职责过重,�一定程度上违背了“单一职责原则”。...四、类的实现对象创建一个静态实例,可以写成全局的,也可以类方法中实现,并置为nil。 用GCD多线程的方式来实现,用dispatch_once_t来保证线程的安全性和单一性。...如果有需要,还可以把整个模式封装成一个宏。

42030

Swift多线程:GCD进阶,、信号量、任务组1. dispatch_once,以及Swift2. dispatch_after3. 队列的循环、挂起、恢复4. 信号量(semaphore

image.png 1. dispatch_once,以及Swift 使用dispatch_once函数能保证某段代码程序运行过程中只被执行1次。...所以通常在OC时代,我们都会用它来写。 但是,但是,但是:这个函数Swift3.0以后的时代已经被删除了。没错,被删除了,不用了。...static var背后已经使用dispatch_once了,所以从Swift 3开始,就干脆把dispatch_once显式的取消了。 凸(艹皿艹 ),那Swift里面的怎么写呐?...你搞事情吧,就这么点?是的,因为是全局变量,所以只会创建一次。 使用final,将这个类终止继承。 设置初始化方法为私有,避免外部对象通过访问init方法创建类的实例。...iOS多线程系列之三:使用GCD实现异步下载图片。 好奇宝宝们有没有想过,创建信号量的时候初始值设置成2或者更大的数,例如50,会是什么效果? 自己敲敲代码试试喽,想想看。

2.5K50

iOS开发中的模式

简介 开发者应该经常看到模式这个设计模式,那什么是模式呢?...那么对于这种要求保证只有一个对象实例的设计模式,就称为模式,简明易懂是吧。 iOS开发中的实现 介绍完了模式是什么,现在看看怎么实现。...各个语言都有自己的模式,其实对于模式实现,最根本的一点就在于保证全局只有一个对象实例。也就是说每次要使用的时候,如果还没创建过实例,那就创建,如果已经创建过了,那就直接获取之前创建过的。...这是一种方法,但其实判断是否为 nil 需要一定时间,虽然也不多,但是万一在这个时间之内创建了两个实例呢,尤其是多线程的情况。... alloc 时,Objective-C 会调用 allocWithZone ,通过覆写它来返回单。复制对象的时候也是通过覆写调用的 copyWithZone 方法来达到返回唯一的目的。

77620

深度解析 iOS底层 - 单列销毁

前言 ,我们开发中使用很频繁的一种设计,你有没有想过, 为什么其会在app生命周期中只执行一次? 系统底层做了哪些事情来实现的呢? 再一点,可不可以销毁呢?... static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ class = [[self alloc] init...首先,我们先写一个来断点调试看一: + (instancetype)shareSM { static SMObject *class = nil; static dispatch_once_t...接下来,我们就看一 diapatch_once 函数的底层源码实现dispatch_once void dispatch_once(dispatch_once_t *val, dispatch_block_t...从 shareSM 中提取出来,放到类中: static SMObject *class = nil; static dispatch_once_t predicate; 滑动显示更多 这样,就可以实现的销毁

72220

Swift模式

参考:http://swifter.tips/singleton/ OC写法 Objective-C 中的公认的写法类似下面这样: @implementation MyManager + (id...GCD 中的 dispatch_once_t 可以保证里面的代码只被调用一次,以此保证在线程上的安全。...初始化类变量的时候,Apple 将会把这个初始化包装在一次 swift_once_block_invoke 中,以保证它的唯一性。...另外,我们在这个类型中加入了一个私有的初始化方法,来覆盖默认的公开初始化方法,这让项目中的其他地方不能够通过 init 来生成自己的 MyManager 实例,也保证了类型的唯一性。...如果你需要的是类似 defaultManager 的形式的 (也就是说这个类的使用者可以创建自己的实例) 的话,可以去掉这个私有的 init 方法。

1.2K50
领券