objective-c 单例模式详解

【单例模式 Objective-C语言】 单例模式 Objective-C语言 阅读详情

最近在项目中需要用到单例模式(singleton),于是对谷歌了一些资料发现objective-c中的单例不是想象中的,apple官方文档建议并非如此,代码量是我好几倍,但是既然官方建议一定是有道理的,谷歌了写资料,多数都是建议这么使用,却没人对此做详解

因为没理解透,用着不踏实,所以决定做些调试,了解透彻!

看完如还有疑问可以进IOS中高级开发群:118623167 和大家交流

按照一般的思路,如下

static MyClass *class = nil;

@implementation MyClass

+(MyClass *)sharedMyClass{

    if (!class) {

        [[self alloc] init];

    }

    returnclass;

}

@end

 

调试发现

MyClass *A = [[MyClass alloc] init];

NSLog(@"A:%@",A);

MyClass *B = [MyClass sharedMyClass];

NSLog(@"B:%@",B);

 

打印出的是

A:<MyClass: 0x6c72d30>

B:<MyClass: 0x6a87e60>

不是一个内存地址,也就是不是同一个实体

 

官方如下方式实现

static MyClass *class = nil;

 

@implementation MyClass

 

+(MyClass *)sharedMyClass{

    @synchronized(self){  //为了确保多线程情况下,仍然确保实体的唯一性

        if (!class) {

            [[self alloc] init]; //该方法会调用 allocWithZone

        }

    }

    returnclass;

}

 

+(id)allocWithZone:(NSZone *)zone{

    @synchronized(self){

        if (!class) {

            class = [super allocWithZone:zone]; //确保使用同一块内存地址

            return class;

        }

    }

    returnnil;

}

 

- (id)copyWithZone:(NSZone *)zone;{

    return self; //确保copy对象也是唯一

}

 

-(id)retain{

    return self; //确保计数唯一

}

 

- (unsigned)retainCount

{

   return UINT_MAX;  //装逼用的,这样打印出来的计数永远为-1

}

 

- (id)autorelease

{

    return self;//确保计数唯一

} 

 

- (oneway void)release

{

     //重写计数释放方法

}

@end

 

再调试

MyClass *A = [[MyClassalloc] init];

NSLog(@"A:%@",A);

MyClass *B = [MyClasssharedMyClass];

NSLog(@"B:%@",B);

MyClass *C = [A copy];

NSLog(@"C:%@",C);

 

打印出的是

A:<MyClass: 0x6a1e130>

B:<MyClass: 0x6a1e130>

C:<MyClass: 0x6a1e130>

都是指向同一块内存地址

答案已经出来了

apple建议的方式显然真正的确保了实体的唯一性

objective-c单例模式的完整书写方式 Objective-c 单例模式的完整书写方式,用了很久的单例模式了,却发现singleton的用法也是蛮有讲究的。不过一般情况下,即使不书写完整的单例,也不会出现什么意外情况。。 立即下载

相关推荐

Xcode-Singleton-Templates:Objective-C 的单例模板

Xcode-Singleton-Templates 这些是 Singleton 类和 TestCase 的模板。 下面显示的代码是将通过的测试用例模板的一部分。 KO2Abc* a = [KO2Abc sharedInstance]; KO2Abc* b = [[KO2Abc alloc] init]; KO2Abc* c = [KO2Abc allocWithZone:nil]; KO2Abc* d = [KO2Abc new]; KO2Abc* e = [[KO2Abc alloc] copy]; KO2Abc* f = [[KO2Abc alloc] mutableCopy]; XCTAssertEqualObjects(a, b); XCTAssertEqualObjects(a, c); XCT

Objective-C中的单例模式(singleton)

以我自己做过的项目来看,单例模式(singleton)在所有设计模式中应该是用得频繁的。其中心思想和作用也是在设计模式中最简单的,在接触这这个模式后没有程序员不会喜欢它。好了,废话不多说,立即看一下在Objective-C语言里是怎么实现单例模式。在Objective-C中实现单例和其它语言实现的思想基本一致。

电台小猫走天涯 641

objc-singleton:如何实现安全的 Objective-C 单例

Objective C Singleton :backhand_index_pointing_right: 实现安全的Objective C Singleton。 :beer_mug: 关于安全 “安全”是指: 多线程安全 使用安全,即通过new类方法、init方法仍然返回的是同一个单例对象。new/init方法不做处理用户是可以调用的。 第二点在场景上看起来有些吹毛求疵,用户可以粘贴示例代码或是看一下文档可以做到通过工厂方法获得单例,规避这个问题。 在各篇Objective C Singleton文章中这方面几乎都没有得到重视,但对于API的用户上是有意义的。 关于: 只有几人两三应用使用的API,不要谈API设计重要或复杂。 这种情况下,积极感受问题跟进改进API看起来更有性价比。 没写给成百上千人上百应用使用的API,不要谈API设计不重要或复杂。 这种情况下,一个细微的改进能省下支持工作,并值得提高用户的体验和用户对产品的评价。 解决线程安全 有以下方案:

【Objective-C】单例模式

对单例模式的一般实现方法、苹果官方提供的GCD实现方法进行了学习

XY_Mckevince的博客 954

ROS应用之如何配置RTOS满足机器人系统中的实时要求

实时操作系统(RTOS)基本概念实时操作系统(RTOS)是设计用于实时应用的操作系统,其主要目标是在确定的时间内完成任务。RTOS的任务调度算法和优先级控制机制能够确保高优先级任务按时完成。精确的传感器数据采集:传感器数据需要在规定时间内采集并传输给控制系统。快速响应外部事件:对于控制系统,需要确保指令在最短的时间内得到响应。任务的调度周期:任务的周期可以通过公式计算,其中 ftask 是任务的调度频率。优先级分配。

weixin_68094467的博客 1007

雪莉果的Axure原型工厂vol.006 中继器应用(二)——多选穿梭框

如果你用axure有一段时间了,那么你很快就能琢磨出一个大体设计流程,比如加一个中间过度的元件,来储存需要穿梭的内容;但是如果你再想一想,就会发现,这样做,似乎只能解决单选,那么多选需要怎么操作呢? 这时候,中继器就会告诉你,我还能做的更多。

weixin_43829792的博客 976

Objective-C实现单例

单例,顾名思义,即有且只有一个实例。那么创建函数(sharedInstance)被多次调用,以及多线程场景下,如何保证这一点? 使用GCD技术: +(instancetype)sharedInstance { static ClassName* _sharedInstance = nil; static dispatch_once_t onceToken; dispa...

auspark的专栏 636

细聊Oracle通过ODBC数据源连接SQL Server数据库

    类似文章搜索引擎上有很多,内容大致相同,今天所谓细聊是因为我在借鉴这些文章时候走了些弯路,所以写此文,为自己备忘,同时如果能为初涉此处知识点的小伙伴提供些帮助就更好了,废话不多说。    我的应用场景:    项目系统使用oracle数据库,与客户的第三方系统供应商实现资源共享,对方为sql server数据库;    我的测试开发环境为64bitwin7PC机,本机上装有64位Oracl...

xueren_83的博客 1万+

Objective-C单例

一、要点:1.当在应用程序中只需要有类的一个实例,并且可以被其它对象轻松的访问的时候,可以使用单例类。2.首先需要声明一个静态的类的实例变量,并初始化为nil。应该将该实例变量声明在类的实现文件中,表示变量仅在该实现文件中有效。3.添加工厂方法,用于创建并返回单例类的实例,在需要线程安全的情况下,需要添加同步代码。4.为了防止用户调用alloc等方法创建或者做其它影响生命周期的操作,我们需要重载一

有志者事竟成-程序员也可以创造优雅的艺术 433

U8+ 新建账套

一、登录 账套主管:demo 对账套有修改权限,有账套库权限 系统管理员:admin 其他所有权限 二、新建账套 admin登录–>点击系统管理–>账套–>建立 选择了参照已有账套结转期初:就是上一个的期末数据作为这一次新表的期初数据 启用会计期一旦选择更改不了。 ...

茶茶很困i 3693

CKAD-CN 考试知识点分享(2) CronJob

成功创建 CronJobppi,每 5 分钟执行一次计算任务;配置了和;设置,超时自动终止;确保 Pod 不重启;手动创建ppi-testJob 验证功能正常;所有任务要求均已满足。

轻的博客 329

Objective-C 中的单例

其实对于单例,在程序开发中非常的常见。 最近我也对单例进行了一些更细致的研究。 在我的程序中,单例一般是这么去写的: + (DataSource *)shareInstance {     static DataSource *instance = nil;     if (instance == nil)     {         instance = [[DataSource

SampooWoo的专栏 2987

YOLOv8改进,MobileNetV3轻量化架构改进特征提取网络,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3834

Swift 和 Objective-C 单例模式详解

单例模式要求一个类有一个实例,有公开接口可以访问这个实例。单例模式分为以下两种模式: 严格单例模式 严格单例模式,要求一个类只有一个实例。 不严格单例模式 不严格单例模式,可以创建多个实例。 有的类只能有一个实例,例如 UIApplication 类,通过 shared 属性访问唯一的实例,属于严格单例模式。废话不多说,接下来看看 Swift 和 Objective-C 的每...

腾飞的博客 | TF's Blog 216

RAG系统中Reranker模型选型实战

本文详细介绍了RAG系统中Reranker模型选型实战,希望能对学习RAG的同学们有所帮助。 文章目录 1. 前言 2. 思路解析 3. 测评数据集构建 3.1 步骤一 3.2 步骤二 3.3 数据示例 3.4 总结 4. 实战代码 4.1 本地模型 4.2 使用第三方的Reranker模型API

herosunly的博客 17万+

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7088

Objective-c单例模式详解

转载自:http://www.jianshu.com/p/85618bcd4fee 单例模式出现以后,关于它的争执就一直存在。在开发项目中,有很多时候我们需要一个全局的对象,而且要保证全局有且仅有一份即可。没错,单例在这个时候就是最佳的选择,但是需要注意的是:在多线程的环境下也需要做好线程保护。其实系统已经有很多单例存在,例如UIApplication、NSNotification、N...

167

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Objective-C单例模式终极指南:线程安全的sharedInstance实现详解

Objective-C单例模式是iOS开发中最常用的设计模式之一,它能确保一个类只有一个实例,并提供全局访问点。在Objective-C编程规范中,单例模式的正确实现被特别强调,因为错误的实现可能导致应用频繁崩溃。本文将深入解析Objective-C单例模式的线程安全实现方法,帮助你掌握这一重要的编程技巧。🎯 ## 为什么需要单例模式? 单例模式在iOS开发中有着广泛的应用场景,比如: -

gitblog_00282的博客 442

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

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

Objective-C学习笔记

目录V. 面向对象V-I 类与对象Tips1.#import2.NSLog函数 V. 面向对象 V-I 类与对象 类:是某一批对象的抽象,可以把类理解成某种概念; 对象:是一个具体存在的实体。 定义类 a. 关键字:@interface 、 @end、@implementation b. 继承:NSObject 对象的产生和使用 创建对象语法格式:[[类名 alloc] 初始化方法]; 其中alloc是Objective的关键字,负责为该类分配内存空间、创建对象。因为所有对象都继承了NSObjec

weixin_45747214的博客 835

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Objective-C学习 单例模式

单例模式需要实现一个公共访问的类方法,一般命名为 shared + 类名。在该方法的具体实现方案,是推荐通过dispatch_once 来实现类的实例化。static保存唯一对象, 用dispatch_once 保证只创建一次。保证一个类在程序运行期间只创建一个对象,并提供一个全局访问入口。可以直接通过重写父类的方法,把分配内存的方法变成。,就会触发这个重写的方法,从而产生递归。如果对象已经创建 – > 直接返回。如果对象没有创建 – > 创建。的单例实现中,我们通常会重写。从根本上实现了单例。

for_ever_love__的博客 377

LCActionSheet配置详解:全局样式与单例模式的优雅实践

想要在iOS应用中实现优雅的底部弹窗菜单吗?LCActionSheet是一款简约而强大的ActionSheet组件,被微博、微信和QQ等主流应用采用类似样式,完全支持Swift和Objective-C。本文将深入探讨LCActionSheet的全局样式配置与单例模式的优雅实践,帮助开发者快速掌握这款优秀的iOS弹窗组件。 ## 📱 LCActionSheet简介与核心功能 LCActionS

gitblog_00314的博客 811

Objective-C中单例模式(Singletons)的实现

单例的介绍 单例模式是在iOS开发中最常用的一种设计模式,单例模式可以让程序的各个模块共享数据,而不用去手动的去传递。所以单例类是一个我们要去理解的非常重要的模式,这种模式贯穿于iPhoneSDK中,例如UIApplication有一个方法叫做shareApplication用来共享当前程序的UIApplication实例。 单例的实现 添加一个ShareData类,在ShareData.h

kingzwt2009的专栏 8700
上一篇: UIImageView 添加手势实现点击
下一篇: UIView animateWithDuration 使用详解
qtcreatorlinux
博客等级 码龄15年 17粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值