Objective-C 中字符串的保存位置

server/2024/10/18 12:32:58/

在 Objective-C 中,字符串常量和动态创建的字符串(例如通过 stringWithFormat:、initWithString: 等方法创建的字符串)在内存中保存的位置一样么 ?

在 Objective-C 中,字符串常量和动态创建的字符串在内存中的保存位置通常是不一样的。这主要是因为它们的创建方式不同,导致它们在内存管理上的处理方式也不同。

字符串常量

字符串常量是在编译时确定的,并且通常存储在程序的只读数据段(也称为常量区或文字区)。这部分内存区域是只读的,用于存储程序中不可变的常量数据。这种处理方式使得相同的字符串常量只在内存中存储一份,从而实现字符串驻留(String Interning)。

例如:

NSString *string1 = string">@"Hello, World!";
NSString *string2 = string">@"Hello, World!";NSLog(string">@"%p", string1); // 输出某个地址
NSLog(string">@"%p", string2); // 输出与 string1 相同的地址

在这个例子中,string1string2 指向同一个内存地址,因为它们都是字符串常量,存储在只读数据段。

动态创建的字符串

动态创建的字符串是通过方法调用在运行时生成的。这些字符串通常存储在堆(heap)中。堆内存是用于动态分配的,存储在堆中的对象可以在运行时创建和销毁。由于每次调用方法都会创建一个新的字符串对象,即使内容相同,这些字符串对象也会有不同的内存地址。

例如:

NSString *dynamicString1 = [NSString stringWithFormat:string">@"Hello, World!"];
NSString *dynamicString2 = [NSString stringWithFormat:string">@"Hello, World!"];NSLog(string">@"%p", dynamicString1); // 输出某个地址
NSLog(string">@"%p", dynamicString2); // 输出不同的地址

在这个例子中,dynamicString1dynamicString2 指向不同的内存地址,因为它们是通过 stringWithFormat: 方法动态创建的,存储在堆中。

总结

  • 字符串常量:存储在只读数据段。相同的字符串常量只存储一份,实现字符串驻留(String Interning)。
  • 动态创建的字符串:存储在堆中。每次创建新的字符串对象,即使内容相同,内存地址也不同。

理解字符串常量和动态创建字符串的内存位置差异有助于优化内存使用和性能。在实际开发中,如果需要频繁使用相同内容的字符串,尽量使用字符串常量,以减少内存开销和提高字符串比较的效率。

参考示例代码

以下代码展示了字符串常量和动态创建字符串在内存中的不同位置:

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {// 字符串常量NSString *string1 = string">@"Hello, World!";NSString *string2 = string">@"Hello, World!";// 动态创建的字符串NSString *dynamicString1 = [NSString stringWithFormat:string">@"Hello, World!"];NSString *dynamicString2 = [NSString stringWithFormat:string">@"Hello, World!"];// 打印字符串内容NSLog(string">@"Constant String1: %@", string1);NSLog(string">@"Constant String2: %@", string2);NSLog(string">@"Dynamic String1: %@", dynamicString1);NSLog(string">@"Dynamic String2: %@", dynamicString2);// 打印指针指向对象的地址NSLog(string">@"Constant String1 Address: %p", string1);NSLog(string">@"Constant String2 Address: %p", string2);NSLog(string">@"Dynamic String1 Address: %p", dynamicString1);NSLog(string">@"Dynamic String2 Address: %p", dynamicString2);}return 0;
}

运行结果会显示字符串常量指向相同的内存地址,而动态创建的字符串指向不同的内存地址。通过这些示例,可以更直观地理解字符串在内存中的存储位置及其差异。


http://www.ppmy.cn/server/62292.html

相关文章

微信小程序 - 本地存储 增加有效期

小程序的本地存储API提供了wx.setStorageSync和wx.setStorage来存储数据&#xff0c;注意的是&#xff0c;小程序的本地存储并没有明确的有效期设置&#xff0c;存储的数据在不超过限制的情况下&#xff0c;会一直保留。 一、小程序本地存储API 小程序的本地存储API提供了设置…

摄像头 RN6752v1 视频采集卡

摄像头 AHD倒车摄像头比较好&#xff0c;AHD英文全名Analog High Definition&#xff0c;即模拟高清&#xff0c;拥有比较好的分辨率与画面质感。 RN6752v1 GQW AKKY2 usb 采集卡 FHD&#xff08;1080p&#xff09;、HD&#xff08;720p&#xff09;和D1&#xff08;480i&am…

钡铼Modbus TCP耦合器BL200实现现场设备与SCADA无缝对接

前言 深圳钡铼技术推出的Modbus TCP耦合器为SCADA系统与现场设备之间的连接提供了强大而灵活的解决方案&#xff0c;它不仅简化了设备接入的过程&#xff0c;还提升了数据传输的效率和可靠性&#xff0c;是工业自动化项目中不可或缺的关键设备。本文将从Modbus TC、SCADA的简要…

阿里云API安全2.0全新发布

阿里云安全发布API防护产品已将近三年&#xff0c;为客户提供API资产全生命周期监控管理&#xff0c;发现和管理业务中存在的全量API接口资产&#xff0c;并提升API接口在数据流转过程中的安全性&#xff0c;现已全面覆盖OWASP提出的API TOP 10安全风险。 近期&#xff0c;阿里…

在SpringCloud中如何轻松实现微服务间的通信

在Spring Cloud中&#xff0c;实现微服务间的通信非常简单。Spring Cloud提供了多种方式来进行微服务之间的通信&#xff0c;包括使用RestTemplate、Feign、Ribbon、Eureka等组件。下面我将详细介绍这些方式的使用方法。 使用RestTemplate进行通信&#xff1a; RestTemplate是S…

opencv—常用函数学习_“干货“_10

目录 二七、离散余弦变换 执行离散余弦变换 (dct) 和逆变换 (idct) 解释 实际应用 JPEG压缩示例&#xff08;简化版&#xff09; 二八、图像几何变换 仿射变换 (warpAffine 和 getAffineTransform) 透视变换 (warpPerspective 和 getPerspectiveTransform) 旋转变换 (g…

深层神经网络示例

维度说明&#xff1a; A[L]、Z[L]&#xff1a;&#xff08;本层神经元个数、样本数&#xff09; W[L]&#xff1a;&#xff08;本层神经元个数、上层神经元个数&#xff09; b[L]&#xff1a;&#xff08;本层神经元个数、1&#xff09; dZ[L]&#xff1a;dA[L] * g’A&#xf…

AI写作不懂提示词 大象Prompt 保姆级系列教程三

一、提示词的核心价值究竟是啥&#xff1f; 最近跟不少业内朋友探讨这事儿&#xff0c;我觉得&#xff1a;提示词的核心价值在于对方法论的封装以及由此带来的知识传播速度加快。 通俗讲&#xff0c;假如你熟悉的行业里有个厉害的“老师傅”&#xff0c;他在核心业务上有好多心…