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

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I