iOS单例的创建与销毁示例
发布时间 - 2026-01-10 23:19:22 点击率:次单例:单例模式使一个类只有一个实例.单例是在使用过程,保证全局有唯一的一个实例.这样,才能满足统一管理的功能.例如,一个数据库,只需要全局统一的读取,写入操作.不要多个实例去读写.d单例是唯一实例,它不等同于一直伴随这app的生命周期.下面,我会从单例的创建与销毁去分析单例.

单例的创建
单例的创建分为arc与mrc,两种模式下的创建.
ARC 下的创建
- 先定义一个静态的instance. static MyClass _instance;
- 重写allocWithZone方法.此方法为对象分配空间必须调用方法.
- 定一个个share的类方法.能够被全局调用的.此方法里需要考虑线程安全问题
- 如果需要copy,需要遵守NSCopying协议,以及在copyWithZone中,直接返回self;
例子
static Myclass _instance;
方法一:
+(id)shareInstance{
@synchronized(self){
if(_instance == nil)
_instance = [MyClass alloc] init];
}
return _instance;
}
方法二:
+(id)shareInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if(_instance == nil)
_instance = [MyClass alloc] init];
});
return _instance;
}
以上两种方法都是线程安全的.不过苹果官方现在提倡方法二.
This method exists for historical reasons; memory zones are no longer used by Objective-C. You should not override this method.
//重写allocWithZone,里面实现跟方法一,方法二一致就行.
+(id)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if(_instance == nil)
_instance = [MyClass alloc] init];
});
return _instance;
}
这个函数重写,是错误的。请读者注意。
//保证copy时相同
-(id)copyWithZone:(NSZone *)zone{
return _instance;
}
这样就是一个完整的单例,保证怎么创建都是唯一的.
MRC下的创建 创建过程跟ARC下步骤一样.不过要处理一些内存管理的函数.
//不需要计数器+1
- (id)retain {
return self;
}
//不需要. 堆区的对象才需要
- (id)autorelease {
return self;
}
//不需要
- (oneway void)release {
}
//不需要计数器个数. 直接返回最大无符号整数
- (NSUInteger)retainCount {
return UINT_MAX; //参照常量区字符串的retainCount
}
这样就能保证这个单例不会被无意释放.
单例的销毁
前面讲了单例的创建,但是有个别情况需要销毁单例.
下面分别从两种创建方法对应两种销毁形式.
方法一:
+(void)attemptDealloc{
[_instance release]; //mrc 需要释放,当然你就不能重写release的方法了.
_instance = nil;
}
方法二:
1. 必须把static dispatch_once_t onceToken; 这个拿到函数体外,成为全局的.
2.
+(void)attempDealloc{
onceToken = 0;
// 只有置成0,GCD才会认为它从未执行过.它默认为0.这样才能保证下次再次调用shareInstance的时候,再次创建对象.
[_instance release];
_instance = nil;
}
以上两种方法即为销毁单例的方法.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# ios
# 单例销毁
# 创建单例
# 单例的销毁
# IOS Swift3 四种单例模式详解及实例
# 使用设计模式中的Singleton单例模式来开发iOS应用程序
# iOS App开发中使用设计模式中的单例模式的实例解析
# IOS 中两种单例模式的写法实例详解
# 谈一谈iOS单例模式
# 详解IOS 单例的两种方式
# iOS开发教程之单例使用问题详析
# 两种
# 不需要
# 重写
# 都是
# 是在
# 我会
# 你就
# 就能
# 多个
# 才会
# 是唯一
# 就行
# 只有一个
# 只需要
# 体外
# 讲了
# 它不
# 即为
# 大家多多
# 默认为
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
EditPlus中的正则表达式 实战(4)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
清除minerd进程的简单方法
高端企业智能建站程序:SEO优化与响应式模板定制开发
实例解析angularjs的filter过滤器
java获取注册ip实例
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何快速生成高效建站系统源代码?
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel如何创建自定义Facades?(详细步骤)
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel如何实现一对一模型关联?(Eloquent示例)
如何批量查询域名的建站时间记录?
Laravel如何实现用户密码重置功能?(完整流程代码)
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在局域网内绑定自建网站域名?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
如何实现javascript表单验证_正则表达式有哪些实用技巧
在centOS 7安装mysql 5.7的详细教程
Laravel如何使用Vite进行前端资源打包?(配置示例)
公司网站制作价格怎么算,公司办个官网需要多少钱?
大同网页,大同瑞慈医院官网?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
nodejs redis 发布订阅机制封装实现方法及实例代码
Laravel Fortify是什么,和Jetstream有什么关系
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
想要更高端的建设网站,这些原则一定要坚持!
高防服务器租用如何选择配置与防御等级?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
利用python获取某年中每个月的第一天和最后一天
如何在阿里云香港服务器快速搭建网站?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何用花生壳三步快速搭建专属网站?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
微信小程序 五星评分(包括半颗星评分)实例代码
iOS中将个别页面强制横屏其他页面竖屏
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何在建站宝盒中设置产品搜索功能?
如何正确选择百度移动适配建站域名?
Laravel如何使用.env文件管理环境变量?(最佳实践)
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
轻松掌握MySQL函数中的last_insert_id()
JavaScript实现Fly Bird小游戏
Laravel PHP版本要求一览_Laravel各版本环境要求对照

