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各版本环境要求对照