news 2026/8/12 21:09:08

Objective-C学习 单例模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Objective-C学习 单例模式

文章目录

    • 单例模式的使用
      • 单例模式有两个关键点:
      • 单例要防止 3 种创建方式
      • 完整代码如下:

单例模式的使用

保证一个类在程序运行期间只创建一个对象,并提供一个全局访问入口。

单例模式有两个关键点:

  1. 只能创建一个对象实例
  2. 提供一个全局访问入口

单例要防止 3 种创建方式

  1. alloc
  2. copy
  3. mutablecopy

单例模式需要实现一个公共访问的类方法,一般命名为 shared + 类名。在该方法的具体实现方案,是推荐通过dispatch_once 来实现类的实例化。

可以直接通过重写父类的方法,把分配内存的方法变成只执行一次。从根本上实现了单例。

单例模式主要需要重写三个方法

+ (instancetype) allocWithZone: (struct _NSZone*) zone - (id) copyWithZone: (NSZone*) zone - (id) mutableCopyWithZone: (NSZone*) zone

在 Objective-C 中,调用alloc方法时,底层确实会直接调用allocWithZone:——alloc本质上是allocWithZone:的 “便捷封装”

staticMyManager*_instance;+(instancetype)sharedInstance{staticdispatch_once_t onceToken;dispatch_once(&onceToken,^{_instance=[[superallocWithZone:NULL]init];});return_instance;}

static保存唯一对象, 用dispatch_once 保证只创建一次

如果对象没有创建 – > 创建

如果对象已经创建 – > 直接返回

dispatch_once_t类型的onceToken本质是一个状态变量,它存储着「代码块是否已经执行过」的信息:

  • 初始状态:onceToken是一个特殊的默认值(可以理解为 “未执行”);
  • 第一次执行dispatch_once时:系统会把onceToken的值修改为 “已执行”,并执行代码块;
  • 后续执行dispatch_once时:系统检测到onceToken已是 “已执行” 状态,直接跳过代码块。

instancetypeObjective-C里的一个返回类型关键字,表示:

返回当前类的实例类型。

它主要用于方法返回对象时,让编译器更准确地知道返回的对象类型

为什么单例里要写

[[super allocWithZone:NULL] init]

而不是

[[self alloc] init]

这个其实是防止递归死循环

Objective-C的单例实现中,我们通常会重写allocWithZone:。如果在sharedInstance里再调用[self alloc],就会触发这个重写的方法,从而产生递归。

调用 sharedInstance ↓[[selfalloc]init]↓ alloc ↓ allocWithZone ↓return[selfsharedInstance]↓ 再次进入 sharedInstance ↓[[selfalloc]init]↓ allocWithZone ↓...
+(instancetype)allocWithZone:(struct_NSZone*)zone{return[selfsharedInstance];}-(id)copyWithZone:(NSZone*)zone{return_instance;}-(id)mutableCopyWithZone:(NSZone*)zone{return_instance;}

这段代码重写了allocWithZone:copyWithZone:mutableCopyZone:三种方法, 很好理解,

直接返回唯一对象instance就可以了

完整代码如下:

@implementationMyManagerstaticMyManager*_instance;+(instancetype)sharedInstance{staticdispatch_once_t onceToken;dispatch_once(&onceToken,^{_instance=[[superallocWithZone:NULL]init];});return_instance;}+(instancetype)allocWithZone:(struct_NSZone*)zone{return[selfsharedInstance];}-(id)copyWithZone:(NSZone*)zone{return_instance;}-(id)mutableCopyWithZone:(NSZone*)zone{return_instance;}@end
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 21:08:07

Oracle数据库ORA-01109错误排查与恢复实战指南

1. 问题初探:当数据库拒绝“开门营业”“ORA-01109: database not open”,这个报错对于任何一位Oracle DBA(数据库管理员)或开发者来说,都像是一个熟悉又恼人的门铃声——它告诉你,你想进去的那栋“数据大楼…

作者头像 李华
网站建设 2026/8/12 21:07:18

AI应用开发四大基石:RAG、Agent、MCP与Skill深度解析与实战架构

1. 项目概述:一次高强度实习面试的深度复盘 前几天面了一家公司的AI应用开发实习岗,流程走完,面试官问“你还有什么问题吗?”,我没忍住,半开玩笑地反问了一句:“就面个实习,至于上这…

作者头像 李华
网站建设 2026/8/12 21:01:01

不是 AI 替代人,而是分工变了:一次真实项目的提效与收口复盘

首版交付之后的活,才是真正拉开差距的地方 文章目录 首版交付之后的活,才是真正拉开差距的地方 一、先把口径说清楚,不然数据没有意义 1. 对比范围 2. 传统模式的计算规则 3. 工作量计算公式 4. 优先级分层 5. 评估局限性 7. AI 模式的计算规则 4. 成本单价怎么来的 9. AI 工…

作者头像 李华
网站建设 2026/8/12 20:59:39

链表操作基础与算法训练营任务解析

1. 链表操作基础与算法训练营第四天任务解析作为数据结构中最灵活的存储形式,链表在算法面试中出现的频率仅次于数组。不同于数组的连续存储特性,链表的节点通过指针随机分布在内存中,这种离散存储方式带来了O(1)时间复杂度的插入/删除优势&a…

作者头像 李华
网站建设 2026/8/12 20:56:05

LangGraph实战:基于图编排构建复杂AI工作流与状态管理

1. 项目概述:为什么我们需要 LangGraph? 如果你已经用了一段时间的 LangChain,构建过一些简单的聊天机器人或者文档问答应用,可能会遇到一个瓶颈:当业务流程稍微复杂一点,涉及到多轮对话、条件分支或者需要…

作者头像 李华
网站建设 2026/8/12 20:55:58

AI Agent 面试题 445:Agent在面对模糊需求时如何进行任务澄清和分解?

🔥 AI Agent 面试题 445:Agent在面对模糊需求时如何进行任务澄清和分解?摘要:本文深入解析了「Agent在面对模糊需求时如何进行任务澄清和分解?」这一 AI Agent 领域的核心面试题。文章从 任务分解策略 的基本概念出发&…

作者头像 李华