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;  // 打破循环引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Solidity入门: 函数

函数 Solidity语言的函数非常灵活&#xff0c;可以进行各种复杂操作。在本教程中&#xff0c;我们将会概述函数的基础概念&#xff0c;并通过一些示例演示如何使用函数。 我们先看一下 Solidity 中函数的形式: function <function name>(<parameter types>) {in…

基于 Python 自动化接口测试(踩坑与实践)

文档&#xff1a;基于 Python 的自动化接口测试 目录 背景问题描述与解决思路核心代码修改点及其详细解释最终测试结果后续优化建议 1. 问题背景 本项目旨在使用 Python 模拟浏览器的请求行为&#xff0c;测试文章分页接口的可用性。测试目标接口如下&#xff1a; bashcoder…

Spring Boot教程之五十一:Spring Boot – CrudRepository 示例

Spring Boot – CrudRepository 示例 Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理 1.uni.getSystemInfoSync().screenWidth; 获取屏幕宽度 2.uni.onWindowResize&#xff08;&#xff09; 实时监测屏幕宽度变化 3.根据宽度的大小拿到每行要展示的数量itemsPerRow 4.为了确保样式能够根据 items…

使用强化学习训练神经网络玩俄罗斯方块

一、说明 在 2024 年暑假假期期间&#xff0c;Tim学习并应用了Q-Learning &#xff08;一种强化学习形式&#xff09;来训练神经网络玩简化版的俄罗斯方块游戏。在本文中&#xff0c;我将详细介绍我是如何做到这一点的。我希望这对任何有兴趣将强化学习应用于新领域的人有所帮助…

计算机网络 (32)用户数据报协议UDP

前言 用户数据报协议&#xff08;UDP&#xff0c;User Datagram Protocol&#xff09;是计算机网络中的一种重要传输层协议&#xff0c;它提供了无连接的、不可靠的、面向报文的通信服务。 一、基本概念 UDP协议位于传输层&#xff0c;介于应用层和网络层之间。它不像TCP那样提…

如何将 DotNetFramework 项目打包成 NuGet 包并发布

如何将 DotNetFramework 项目打包成 NuGet 包并发布 在软件开发过程中&#xff0c;将项目打包成 NuGet 包并发布到 NuGet 库&#xff0c;可以让其他开发者方便地引用和使用你的项目成果。以下是将 WixWPFWizardBA 项目打包成 NuGet 包并发布的详细步骤&#xff1a; 1. 创建 .n…

解决GitHub上的README.md文件的图片内容不能正常显示问题

一、问题描述 我们将项目推送到GitHub上后&#xff0c;原本在本地编写配置好可展现的相对路径图片内容&#xff0c;到了GitHub上却不能够正常显示图片内容&#xff0c;我们希望能够在GitHub上正常显示图片&#xff0c;如下图所示&#xff1a; 二、问题分析 现状&#xff1a;REA…

如何解决 VS Code 调试时无法查看 std 中变量的问题

在使用 VS Code 调试 C 程序时&#xff0c;我们经常遇到查看 std 容器或字符串变量时只显示一串数字而看不到实际值的情况。这是由于调试器未启用 pretty-printing 功能导致的。为了解决这个问题&#xff0c;可以在 launch.json 中进行配置。 问题描述 在调试 C 程序时&…

安装MySQL的五种方法(Linux系统和Windows系统)

一.在Linux系统中安装MySQL 第一种方法:在线YUM仓库 首先打开MySQL官网首页 www.mysql.com 找到【DOWNLOADS】选项&#xff0c;点击 下拉&#xff0c;找到 【MySQL Community(GPL) Downloads】 在社区版下载页面中&#xff0c;【 MySQL Yum Repository 】链接为在线仓库安装…

基于mybatis-plus历史背景下的多租户平台改造

前言 别误会&#xff0c;本篇【并不是】 要用mybatis-plus自身的多租户方案&#xff1a;在表中加一个tenant_id字段来区分不同的租户数据。并不是的&#xff01; 而是在假设业务系统已经使用mybatis-plus多数据源的前提下&#xff0c;如何实现业务数据库隔开的多租户系统。 这…

RabbitMQ高级篇之MQ可靠性 数据持久化

文章目录 消息丢失的原因分析内存存储的缺陷如何确保 RabbitMQ 的消息可靠性&#xff1f;数据持久化的三个方面持久化对性能的影响持久化实验验证性能对比Spring AMQP 默认持久化总结 消息丢失的原因分析 RabbitMQ 默认使用内存存储消息&#xff0c;但这种方式带来了两个主要问…

Openssl1.1.1s rpm包构建与升级

rpmbuild入门知识 openssh/ssl二进制升级 文章目录 前言一、资源准备1.下载openssh、openssl二进制包2.安装rpmbuild工具3.拷贝源码包到SOURCES目录下4.系统开启telnet&#xff0c;防止意外导致shh无法连接5.编译工具安装6.补充说明 二、制作 OpenSSL RPM 包1.编写 SPEC 文件2.…

【Unity3D】apk加密(global-metadata.dat加密)

涉及&#xff1a;apk、aab、global-metadata.dat、jks密钥文件、APKTool、zipalign 使用7z打开apk文件观察发现有如下3个针对加密的文件。 xxx.apk\assets\bin\Data\Managed\Metadata\global-metadata.dat xxx.apk\lib\armeabi-v7a\libil2cpp.so xxx.apk\lib\arm64-v8a\libil…

[免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(高校就业)招聘系统(Springboot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(高校就业)招聘系统(Springboot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

RNN心脏病预测-Pytorch版本

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import numpy as np import pandas as pd import torch from torch import nn import torch.nn.functional as F import seaborn as sns from sklearn.preprocessing import Standard…

科普CMOS传感器的工作原理及特点

在当今数字化成像的时代&#xff0c;图像传感器无疑是幕后的关键 “功臣”&#xff0c;它宛如一位神奇的 “光影魔法师”&#xff0c;通过光电效应这一奇妙的物理现象&#xff0c;将光子巧妙地转换成电荷&#xff0c;为图像的诞生奠定基础。而在众多类型的图像传感器中&#xf…

Ubuntu 18.04 解决screen无法滚屏的问题

Ubuntu 18.04 解决screen无法滚屏的问题_ubuntu screen 无法上滑-CSDN博客文章浏览阅读2.7k次&#xff0c;点赞2次&#xff0c;收藏3次。在etc/screenrc中加入termcapinfo xterm* ti:te重新进入screen的sessionscreen -d -r XXX_ubuntu screen 无法上滑https://blog.csdn.net/w…

2025年01月09日Github流行趋势

1. 项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;22750今日star数&#xff1a;1272项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, eltociear项目简介&#xff1a;你…

Spring boot接入xxl-job

Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类&#xff08;写job的业务逻辑&#xff09;去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…