三种字符串的管理方式

NSString的三种实现方式

OC这个语言在不停的升级自己的内存管理,尽量的让自己的

OC的字符串

问题引入

在学习字符串的过程中间会遇到一个因为OC语言更新造成的问题

例如:

int main(int argc, const char * argv[]) {@autoreleasepool {NSString* str1 = [NSString stringWithFormat:@"hello"];NSString* str2 = [NSString stringWithFormat:@"hello"];NSString* str3 = @"hello";NSLog(@"%d", str1 == str2);NSLog(@"%d", str2 == str3);}return 0;
}

按照书上的老版本来说的话,我们这里应该输出两个0才对,因为一个第一个和第二个都是堆区创建的他们应该是不一样的,但是结果却出乎我们的意料,我们这里在堆区中创建的两个字符串的指针地址是一样的。结果输出了1。下面我们就解决一下这个问题。

在这里插入图片描述

我们这时候输出一下这几个字符串的类型,这里就出现了这个NSTaggedPointerString这个类型,这时候我们会感到困惑,为什么我们明明是一个NSString类型,但是为什么会有这几种情况呢?这里涉及到一个类簇的问题,但是这里就简单理解成我们在这个NSString这个大类下有三种小的类别来管理这个类型,从而让字符串有一个更好的储存方式来保障我们的内存使用。

在这里插入图片描述

这时候,我们来正式介绍一下在OC中间有关字符串的几种实现方式。

OC中字符串NSString有三种实现方式,分别为

__NSCFConstantString,

__NSCFString,

NSTaggedPointerString.

现在我们通过一段代码来分析这三种字符串的差异

代码示例

我们给出一段代码来分析一下有关这三种字符串的内容:

int main(int argc, const char * argv[]) {@autoreleasepool {NSString* str1 = @"hello";NSString* str2 = [NSString stringWithFormat:@"helloworld"];NSString* str3 = [NSString stringWithFormat:@"神"];NSString* str4 = [NSString stringWithFormat:@"hello"];NSLog(@"%lu, %@", [str1 retainCount], [str1 class]);NSLog(@"%lu, %@", [str2 retainCount], [str2 class]);NSLog(@"%lu, %@", [str3 retainCount], [str3 class]);NSLog(@"%lu, %@", [str4 retainCount], [str4 class]);//输出他的一个引用计数和一个类型}return 0;
}

这是这个的输出结果:

在这里插入图片描述

我们现在就了解一下这三种字符串

__NSCFConstantString类型
  • 这个字符串类型是在常量区创建的一个字符串
  • 这个字符串是一种编译时的常量
  • 我们可以用@""stringWithString方式创建
  • 打印的retainCount的值是很大的,无法通过release方式去释放,是一个单例模式
int main(int argc, const char * argv[]) {@autoreleasepool {NSString* str1 = @"hello";NSString* str2 = [NSString stringWithFormat:@"helloworld"];NSString* str3 = [NSString stringWithFormat:@"神"];NSString* str4 = [NSString stringWithFormat:@"hello"];NSLog(@"%lu, %@", [str1 retainCount], [str1 class]);//NSLog(@"%lu, %@", [str2 retainCount], [str2 class]);//NSLog(@"%lu, %@", [str3 retainCount], [str3 class]);//NSLog(@"%lu, %@", [str4 retainCount], [str4 class]);[str1 release];NSLog(@"%lu, %@", [str1 retainCount], [str1 class]);}return 0;
}

这里我们进行了一次release操作,按道理来说我们应该是把对他进行了一次释放的,但是打印结果是

在这里插入图片描述

这里发现我们无法对其进行释放,所以我们可以认为他是一个单例。

__NSCFString

  • 这个字符串类型是一个在堆区创建的一个字符串
  • 这个字符串是在运行的时候创建的
  • 较长字符串会自动转化成这个类型
  • 中文字符串也会自动转成这个类型
    这是他的引用计数:
    在这里插入图片描述

从引用计数可以看出他不是一个单例,可以被释放。
借用一段学长的话来对于这个字符串类型进行一个讲解:

即使两个对象的内容相同,它们在堆上的内存地址也是不同的。每个对象都在独立的内存空间中存储,具有自己的地址。这意味着通过不同的对象引用访问这两个对象时,实际上访问的是不同的内存地址。

NSTaggerPointerSring

这个字符串类型是最新的一个字符串类型,他也是在堆区创建的但是他可用用来存储一下较短字符串,实现一个节约内存的效果,引用一段学长的话

TaggedPointer的意思是标签指针,这是苹果在 64 位环境下对 NSString,NSNumber
等对象做的一些优化。简单来讲可以理解为把指针指向的内容直接放在了指针变量的内存地址中,因为在 64 位环境下指针变量的大小达到了 8
位足以容纳一些长度较小的内容。于是使用了标签指针这种方式来优化数据的存储方式。从他的引用计数可以看出,这货也是一个释放不掉的单例常量对象。在运行时根据实际情况创建。

这里是有关他的引用计数:
在这里插入图片描述
从这里可以看出他是一个单例。
也是通过一个stringWithFormat方式,但是由于较短英文字符串,所以可以用地址来直接存储较短英文字符串的数值,这是一个单例。

  • 是一个单例
  • 是在堆区创建的一个字符串
  • 可以将其当作一个伪对象,对象直接被存储在指针的地址上面
  • 较短且在堆区创建的字符串会呈现出这个样式(长度小于9)

总结

我们这里简单介绍了三种字符串的实现方式,这里只是简单的介绍了这三种字符串的格子的一个特点,没有深入的去研究它的底层代码,我们这里主要需要理解在不同的情况下,字符串的创建出的类别是不一样的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络原理——http/https ---http(1)

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 网络原理 HTTP/HTTPS HTTP,全称为"超文本传输协议" HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议. 实际上,HTTP最新已经发展到 3.0 但是当前行业中主要使用的HT…

明日周刊-第12期

以前小时候最期待六一儿童节了,父母总会给你满足一个愿望,也许是一件礼物也许是一次陪伴。然而这个世界上其实还有很多儿童过不上儿童节,比如某些地区的小孩子,他们更担心的是能不能见到明天的太阳。 文章目录 一周热点航天探索火…

LeetCode-77. 组合【回溯】

LeetCode-77. 组合【回溯】 题目描述:解题思路一:回溯背诵版解题思路三:0 题目描述: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入&a…

算法-对列表元素划分成两个和值最大且相等的子列表

现有私募基金发行一支特殊基金产品,该基金认购人数上限不超过 30 人, 募集总金额不超过 3000W,每个投资人认购金额不定。该基金只能将募集到的钱用于投资两支股票,且要求两支股票投资金额必须相同,且每位投资人的钱只能…

springboot报错:Failed to start bean ‘documentationPluginsBootstrapper‘

项目场景: springboot项目启动时报错 问题描述 具体报错信息: 可能原因分析: 1、SpringFox的版本与Spring Boot的版本不兼容。解决这个问题,你可能需要检查你正在使用的SpringFox和Spring Boot的版本,确保它们是兼容…

【Intro】Heterogeneous Graph Attention Network(HAN)

论文链接:https://arxiv.org/pdf/1903.07293 Abstract 异构性和丰富的语义信息给面向异构图的图形神经网络设计带来了巨大的挑战。 -> 一种基于分层注意的异构图神经网络,包括节点级注意和语义级注意。具体来说,节点级关注旨在学习节点…

GPT4o还没用上?落后一个月!

文章目录 一.Share官方网站:以一半的价格享受官网服务1.1 网址1.2 一些介绍和教学实战:1.3 主界面(支持4o):1.4 GPTS(上千个工具箱任你选择):1.5 快速的文件数据分析(以数学建模为例…

web前端三大主流框架指的是什么

web前端三大主流框架是什么?前端开发师的岗位职责有哪些?这边整理了相关内容供大家参考了解,请各位小伙伴随小编一起查阅下面的内容。 web前端三大主流框架 web前端三大主流框架是Angular、React、Vue。 1.Angular Angular原名angularJS诞生…

UnityAPI学习之Transform组件基本使用

目录 Transform组件 访问与获取 Transform的位置和旋转信息 Transform局部坐标和旋转信息的获取 Transform的缩放与正方向 缩放(Scale) 正方向 Transform相关的查找方法 销毁游戏物体 Transform组件 访问与获取 现在创建一个容器放置GrisGO物…

API接口通道如何设置?

API接口通道如何设置? 如果分站点的AI接口使用openai(站点后台->系统配置->AI参数配置->AI接口),则需要在超管后台配置接口通道,其他方式则无需在超管后台配置接口通道 1、进入超管后台选择接口通道&#x…

一键批量转换,高效轻松管理:解锁不同格式图片统一处理新体验,让图片管理更高效

在信息爆炸的时代,图片管理成为了一个不容忽视的问题。我们时常面临各种格式的图片文件,不同的格式不仅增加了管理的难度,还可能导致兼容性问题。如何快速高效地管理不同格式的图片,成为了现代人面临的一大挑战。现在,…

网上帮别人开网店卖货的骗局!

小红书帮别人开店卖货的骗局主要涉及到一些不法分子利用小红书平台的流量和用户信任度,通过虚假宣传、承诺高额利润等手段,诱骗用户开店并**所谓的“赚钱机会”。 这些骗局往往以“轻松创业、快速致富”为诱饵,吸引那些对创业充满热情但缺乏经…

Redis常用命令——List篇

提到List,我们第一时间想到的就是链表。但是在Redis中,List更像是一种双端队列,例如C中的deque。它可以快速高效的对头部和尾部进行插入和删除操作。本片文章主要对List列表的相关命令进行详解,希望本篇文章会对你有所帮助。 文章…

MedSegDiff-V2: Diffusion-Based Medical Image Segmentation with Transformer 论文总结

标题:MedSegDiff-V2: Diffusion-Based(基于扩散模型)Medical Image Segmentation(医学图像分割)with Transformer 论文(AAAI):https://ojs.aaai.org/index.php/AAAI/article/view/28…

【避坑全攻略】如何让私人的LLM拥有一个嗓子——ChatTTS

OpenAI 发布 GPT4o 之后,使得越来越多的人都开始幻想属于自己的AI“伴侣”,这最让人惊艳的就是他们出色的TTS技术。而在此之前,主流的开源TTS有 XTTS 2 和 Bark。而近日,一个名为 ChatTTS 文本转语音项目爆火出圈,引来…

.gitignore 文件

一.什么是 .gitignore 文件 在任何当前工作的 Git 仓库中,每个文件都是这样的: 追踪的(tracked)- 这些是 Git 所知道的所有文件或目录。这些是新添加(用 git add 添加)和提交(用 git commit 提…

汽美汽修店管理系统会员小程序的作用是什么

汽车后市场汽美汽修赛道同样存在着大量商家,连锁品牌店或个人小店等,门店扎堆且区域覆盖面积广,当然每天车来车往也有不少生意。 随着线上化程度加深和商家不断拓展市场的需要,传统运营模式可能难以满足现状,尤其是年…

Element - UI <el-table-column>多选数据提交后禁用已提交的多选框

1. 通过 selection-change"selectionChange" 将已选择的数据存入selectData数组中 <el-table :data"tableData" class"my-5" selection-change"selectionChange" > //多选框已选择的数据 const selectData ref([]); const sel…

HALCON-从入门到入门-图像格式的互相转换

1.废话 上次说到了图片的读取和写入到本地&#xff0c;这次说一下图片的格式相关。 位图和矢量图 photoshop处理出来的图片肯定叫做图片&#xff0c;那么coreDraw处理出来的图片是不是也叫图片。 之间就有区分&#xff0c;一种叫做位图&#xff0c;一种叫做矢量图 位图和矢…

AI大模型探索之路-实战篇13: 从对话到报告:打造能记录和分析的Agent智能数据分析平台

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…