iOS - 数组的真实类型
1. NSArray 类簇
// 1. __NSArray0 (空数组)
NSArray *empty = @[];// 2. __NSArrayI (不可变数组)
NSArray *immutable = @[@1, @2, @3];// 3. __NSArrayM (可变数组)
NSMutableArray *mutable = [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组)
NSArray *single = @[@"one"];// 5. __NSPlaceholderArray (占位数组)
NSArray *placeholder = [NSArray alloc]; // 未初始化
2. 具体类型特点
2.1 NSArray0
// 空数组单例
+ (id)array {return [NSArray alloc] init]; // 返回 __NSArray0 单例
}// 特点:
// 1. 共享单例
// 2. 零内存开销
// 3. 不可修改
2.2 _NSArrayI
// 不可变数组
NSArray *array = @[@1, @2, @3];// 特点:
// 1. 固定大小
// 2. 内存连续
// 3. 查找快速
// 4. 不支持修改
2.3 NSArrayM
// 可变数组
NSMutableArray *array = [NSMutableArray array];
[array addObject:@1];// 特点:
// 1. 动态大小
// 2. 支持增删改
// 3. 容量动态调整
// 4. 内存可能不连续
2.4 _NSSingleObjectArrayI
// 单元素数组优化
NSArray *array = @[@"one"];// 特点:
// 1. 专门优化的单元素存储
// 2. 内存效率高
// 3. 不可修改
2.5 NSConstantArray
// 单元素数组优化
NSArray *array = @[@"one"];// 特点:
// 1. 专门优化的单元素存储
// 2. 内存效率高
// 3. 不可修改// 只有使用 [NSArray arrayWithObj: obj]; 这种方式获取的对应为 _NSSingleObjectArrayI 类型
2.6 __NSFrozenArrayM
* 从可变数组copy到不可变数组时, 如果元素不超过5个,真实类型为 __NSArrayI
* 从可变数组copy到不可变数组时, 如果元素超过5个,真实类型为 __NSFrozenArrayM
3. 内存布局
3.1 不可变数组
struct __NSArrayI {Class isa;uint32_t _count;id _objects[]; // 柔性数组
};// 优点:
// 1. 内存连续
// 2. 访问效率高
3.2 可变数组
struct __NSArrayM {Class isa;uint32_t _count;uint32_t _capacity;id *_objects; // 指针数组
};// 特点:
// 1. 动态扩容
// 2. 内存可能分散
4. 性能特征
4.1 查找性能
// 1. 随机访问
array[index]; // O(1)// 2. 查找元素
[array indexOfObject:obj]; // O(n)
4.2 修改性能
// 1. 添加元素
[mutableArray addObject:obj]; // 平均 O(1),最坏 O(n)// 2. 插入元素
[mutableArray insertObject:obj atIndex:0]; // O(n)// 3. 删除元素
[mutableArray removeObjectAtIndex:0]; // O(n)
5. 使用建议
5.1 类型选择
// 1. 固定内容用不可变
NSArray *constants = @[@1, @2, @3];// 2. 动态内容用可变
NSMutableArray *dynamic = [NSMutableArray array];// 3. 空数组用单例
NSArray *empty = @[];
5.2 性能优化
// 1. 预分配容量
NSMutableArray *array = [NSMutableArray arrayWithCapacity:expectedCount];// 2. 批量操作
[array addObjectsFromArray:objects]; // 比循环添加效率高// 3. 避免频繁调整大小
if ([array count] == 0) {array = [NSMutableArray arrayWithCapacity:100];
}
5.3 内存管理
// 1. 大数组及时释放
@autoreleasepool {NSMutableArray *largeArray = [NSMutableArray array];// 处理大量数据
}// 2. 注意循环引用
array = nil; // 打破循环引用
相关文章:
iOS - 数组的真实类型
1. NSArray 类簇 // 1. __NSArray0 (空数组) NSArray *empty [];// 2. __NSArrayI (不可变数组) NSArray *immutable [1, 2, 3];// 3. __NSArrayM (可变数组) NSMutableArray *mutable [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组) NSArray *single …...
k8s启动报错
执行kubeadm init --image-repository registry.aliyuncs.com/google_containers 出现如下结果: [api-check] The API server is not healthy after 4m0.000885686s Unfortunately, an error has occurred: context deadline exceeded This error is likely caused by:…...
git:指令集
以下是对这些 Git 新特性和命令的更详细解读和实际用例分析,帮助更好地理解它们的作用及适用场景: 1. git switch 和 git restore 背景: 传统上,git checkout 是一个多功能命令,用于切换分支、检出文件、创建分支等&…...
自闭症家庭:建立支持系统与平衡生活
在自闭症家庭的世界里,每一天都充满了挑战与希望。自闭症,这一复杂的神经发育障碍,不仅影响着孩子的成长轨迹,也对整个家庭的生活方式产生了深远的影响。面对这一挑战,许多家庭都在努力寻找有效的支持系统和平衡生活的…...
html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)
htmlcssjs网页设计 美食 美食天下2个页面(里面包含php和mysql) 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…...
高阶知识库搭建实战七、(知识库雏形开发:qianwen-plus+Faiss)(练习推荐)
构建知识库:结合Faiss和qianwen-plus大模型的实践 环境搭建参考前面几篇文章:基础环境搭建、Faiss向量数据库安装 在当今信息爆炸的时代,如何高效地管理和检索海量知识成为了一个重要课题。知识库的构建为我们提供了一种有效的解决方案,它能够将分散的信息整合起来,方便…...
麒麟服务器安装kafka--亲测
我这安装的是单机版本的: 下载地址:Index of /kafka/3.9.0 我下载的是:https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…...
微机——8086微处理器的数据传送指令
目录 数据传送指令: 通用数据传送指令: MOV指令: 堆栈操作指令: PUSH指令: POP指令: 交换指令XCHG: XCHG指令: 换码指令XLAT: 换码指令XLAT: 8086 …...
vue3中onUpdated钩子函数和nextTick的具体使用场景和区别
在 Vue 3 中,onUpdated 钩子函数和 nextTick 方法都用于处理 DOM更新后的操作,但它们的使用场景和触发时机有所不同。以下是它们的具体使用场景和区别,结合代码示例进行解释: onUpdated 钩子函数 使用场景:适用于需要…...
colnames看似简单,却能优化数据处理流程
引言 在数据处理和分析中,变量名称是至关重要的,它们决定了数据的可读性和操作的简便性。在R语言中,colnames 函数以其简单的语法设计,提供了高效管理数据框列名的能力,尤其是在复杂的爬虫任务中显得尤为重要。本篇文…...
欧几里得距离在权重矩阵中的物理意义
欧几里得距离在权重矩阵中的物理意义 目录 欧几里得距离在权重矩阵中的物理意义**衡量神经元差异程度**:**反映模型变化程度**:**聚类和分组的依据**:自然语言处理中的模型更新:**神经网络聚类分组**:欧几里得距离在权重矩阵中的物理意义衡量神经元差异程度: 在神经网络中…...
AI编程辅助开发网站
咋用AI工具快速鼓捣出个网站? 咱都知道,现在这年月,干啥都讲究个效率,做网站更是如此。好在有了那些AI小帮手,不管你是专业搞开发的老手,想让活儿干得更快些,还是从没做过网站的小白࿰…...
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。 关键词 打卡提醒状态管理定时任务输入校验UI交互 一、功能说明 打卡提醒小应用包含以下功能: 提醒时间输入与…...
基于单片机洗衣机控制器的设计(论文+源码)
1需求分析 在智能洗衣机系统设计中,考虑到洗衣机在实际应用过程中,需要满足用户对于不同衣物清洁、消毒的应用要求,对设计功能进行分析,具体如下: 通过按键实现洗衣机不同工作模式的切换,包括标准模式&…...
【Git系列】解析与解决Git错误:RPC失败;curl 56 OpenSSL SSL_read: error:140943FC
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
[Unity Shader] 【游戏开发】Unity基础光照1-光照模型原理
在计算机图形学中,渲染是一个复杂的过程,包含了两个主要部分:决定一个像素的可见性和计算该像素的光照。其中,光照模型是渲染过程中的核心部分,它模拟了真实世界中的光与物体表面的交互,帮助生成最终的图像。在Unity等游戏引擎中,理解光照模型的原理是创建真实感视觉效果…...
基于Python 的宠物管理系统(源码+部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
console.log封装
console.log封装 在控制台中打印带有颜色和格式的日志信息。 /*** 检查给定的对象是否为数组*/ const isArray function (obj: any): boolean {return Object.prototype.toString.call(obj) [object Array] }/*** Logger 构造函数*/ Logger () > {}/*** 根据日志类型返回…...
戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,它负责初始化和测试系统硬件组件,并加载启动操作系统。在某些情况下,如调整启动顺序、更改系统时间或日期、修改硬件配置等,您可能需要进入BIOS进…...
GitLab创建用户,设置访问SSH Key
继上一篇 Linux Red Hat 7.9 Server安装GitLab-CSDN博客 安装好gitlab,启用管理员root账号后,开始创建用户账户 1、创建用户账户 进入管理后台页面 点击 New User 输入用户名、邮箱等必填信息和登录密码 密码最小的8位,不然会不通过 拉到…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
