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

相关文章

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

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

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta