ios开发答疑录系列​--关于IOS单利的思考

2023-11-28 21:58

本文主要是介绍ios开发答疑录系列​--关于IOS单利的思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

============================================================
博文原创,转载请声明出处
电子咖啡(原id蓝岩)
============================================================
近日我写了一段单利代码,如下,有些思考

#import "WQPlaySound.h"
#define DISPOSE_INTERVAL 3@implementation WQPlaySound
static WQPlaySound* instance=nil;
static NSString* lock=@"";+(WQPlaySound*)shareWQPlaySound{    //同步防止多线程访问,这里本来想用instance来作为锁对象的,但是当instance为nil的时候不能作为锁对象@synchronized(lock){if (!instance) {instance= [[WQPlaySound alloc]init];}}return instance;
}

问题一:单利需要release吗?

No class should need to retain a pointer to a singleton class. Singleton class itself keeps a pointer to its instance. Basically, when the user wants to use a singleton, they will request it through a class method (by convention often starting with shared). This method will check if the singleton has been initialized. If not, it will perform the initialization. If there is already an existing instance in memory, it will just return it. Usually, a singleton object will live in memory for the life of the application.

单利生命周期和appdelegate是一样的,因此不需要release


问题二:@synchronized(lock){...}的lock同步锁对象如果是空的话,还工作吗?

Nil value used as mutex for @synchronized() (no synchronization will occur)

这是xcode提示我的,因此不可以用nil,我们可以用空字符串@“”来加锁

修改----2012-11-06

刚才@DolphinOrca 对我的代码提出了疑问,我测试了一下,却是是我的理解错误,在此表示对DolphinOrca 的感谢。

DolphinOrca提出把@synchronized(lock) 替换成@synchronized(self)可以更方便的进行同步。而我当时认为这样子不可以,因为在@synchronized(self) 的时候,self还没有被init,所以self是nil,synchronized(nil)无效。

后来我又做了实验,证明我的观点是错误的。

首先新建单利Singleton

@implementation Singleton
static Singleton* instance=nil;
static int i=0;
+(Singleton*)share{NSLog(@"self:%@----i++:%d",self,i++);    @synchronized(instance){//注意这次是instance不是selfif (instance==nil) {            if((i)>1){ //i>1是为了前两个线程在这里停留两秒,让第三个线程先alloc然后自己再alloc[NSThread sleepForTimeInterval:2];}instance = [[Singleton alloc] init];}}return instance;
}


然后在另一个文件中启动三个线程去获得这个单利,然后打印看三个单利是否相同。

- (void)viewDidLoad
{[super viewDidLoad];//启动三个线程去调用单利	[NSThread detachNewThreadSelector:@selector(getSingleton) toTarget:self withObject:nil];[NSThread detachNewThreadSelector:@selector(getSingleton) toTarget:self withObject:nil];[NSThread detachNewThreadSelector:@selector(getSingleton) toTarget:self withObject:nil];
}
-(void)getSingleton{Singleton* s= [Singleton share];NSLog(@"signle:%@",s);
}

结果如下

2012-11-06 17:21:46.933 SingletonDemo[811:3c07] self:Singleton----i++:0
2012-11-06 17:21:46.934 SingletonDemo[811:4303] self:Singleton----i++:1
2012-11-06 17:21:46.934 SingletonDemo[811:4603] self:Singleton----i++:2
2012-11-06 17:21:48.948 SingletonDemo[811:4603] signle:<Singleton: 0x744a5e0> //<<<<--------
2012-11-06 17:21:48.948 SingletonDemo[811:4303] signle:<Singleton: 0x91174a0>
2012-11-06 17:21:48.948 SingletonDemo[811:3c07] signle:<Singleton: 0x714b6e0>
可以看到输出的singleton对象为三个不同的对象,这是我原来的思想。

线面我门将synchronized锁换成self,其他不变,重新运行,

 @synchronized(self)
输出结果为:

2012-11-06 17:41:32.863 SingletonDemo[866:4603] self:Singleton----i++:1  //self为Singleton类
2012-11-06 17:41:32.863 SingletonDemo[866:3c07] self:Singleton----i++:0
2012-11-06 17:41:32.863 SingletonDemo[866:4103] self:Singleton----i++:2
2012-11-06 17:41:34.879 SingletonDemo[866:4603] signle:<Singleton: 0x750e120>
2012-11-06 17:41:34.879 SingletonDemo[866:3c07] signle:<Singleton: 0x750e120>
2012-11-06 17:41:34.879 SingletonDemo[866:4103] signle:<Singleton: 0x750e120>

可以看到获得的单利为同一对象。

后来思考,这里self是以类class为锁,所以不存在nil的问题。

关于线程同步的问题,我会在以后的blog中继续研究


这篇关于ios开发答疑录系列​--关于IOS单利的思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/430337

相关文章

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin