*NSString 内存存储解析

1 前言:

字符串是存在字符串常量池里面,然后要是有个指针想要指向一个字符串,先会到字符串常量区进行查找

  1. 如果没有,就在字符串的常量区创建一个,把指针指向字符串常量区
  2. 如果有,就直接把指针指向字符串的常量区。
    所以,相同内容的字符串指针,其指向的内存地址都是一样的, 但是这个些字符串的指针变量的内存地址则可以是不同的。

2 验证:

1. 代码:

@interface ViewController ()
@property (nonatomic,copy) NSString *heap_a;///堆区的a
@property (nonatomic,copy) NSString *heap_b;///堆区的b
@end
- (void)viewDidLoad {
    [super viewDidLoad];
    [self setUP];
}

- (void)setUP {
     NSLog(@"---------- 栈区的字符串 ------");
    NSString *a = @"a";
    NSString *b = @"a";
    
    NSLog(@"a对应的字符串对应的字符常量区地址= %p",a);
    NSLog(@"b对应的字符串对应的字符常量区地址= %p",b);
    
    NSLog(@"&a= %p",&a);
    NSLog(@"&b= %p",&b);
    
    NSLog(@".");
    NSLog(@"---------- 堆区的字符串 ------");
    self.heap_a = @"a";
    self.heap_b = @"a";
    
    NSLog(@"self.heap_a对应的字符串对应的字符常量区地址= %p",self.heap_a);
    NSLog(@"self.heap_b对应的字符串对应的字符常量区地址= %p",self.heap_b);
    
    NSLog(@"&a= %p",&_heap_a);
    NSLog(@"&b= %p",&_heap_b);
    
    NSLog(@".");
    NSLog(@"---------- 常量区的字符串 ------");
    NSLog(@"static_a对应的字符串对应的字符常量区地址= %p",static_a);
    NSLog(@"static_b对应的字符串对应的字符常量区地址= %p",static_b);
    
    NSLog(@"&static_a= %p",&static_a);
    NSLog(@"&static_b= %p",&static_b);
}

2.打印:

---------- 栈区的字符串 ------
a对应的字符串对应的字符常量区地址= 0x1071f9260
b对应的字符串对应的字符常量区地址= 0x1071f9260
&a= 0x7fff58a119b8
&b= 0x7fff58a119b0
.
---------- 堆区的字符串 ------
self.heap_a对应的字符串对应的字符常量区地址= 0x1071f9260
self.heap_b对应的字符串对应的字符常量区地址= 0x1071f9260
&a= 0x7fd6cc6053a0
&b= 0x7fd6cc6053a8
.
---------- 常量区的字符串 ------
static_a对应的字符串对应的字符常量区地址= 0x1071f9260
static_b对应的字符串对应的字符常量区地址= 0x1071f9260
&static_a= 0x1071fce40
&static_b= 0x1071fce48

3 总结:

  1. 字符串指针指向的地址都在字符串常量区:

从上面打印可以看出所有的指针指向的地址:都在0x1071f9260

  1. 栈区 / 常量区 / (属性)堆区 字符串指针的地址:
  1. 指针指向的地址是不一样的,证明每个内存地址都开辟了一个指针空间,但是存储了相同的字符串常量区的地址
  1. 字符串常量区,存在常量区中
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,480评论 3 44
  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 2,621评论 2 26
  • C语言指针的总结 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一...
    xx_cc阅读 3,845评论 11 39
  • 人难免会有个感冒发烧什么的,每户家庭都或多或少的会备一些医用药品在家里。狗狗作为家庭的一员,他比人拥有更强的免疫力...
    靓仔宠物食品店阅读 376评论 0 0
  • 摘录【从“动画营”开始进入创作】 我们让小朋友学艺术 最后总是希望他们成为创作者而不仅仅是欣赏者 把看展览,看画册...
    金悦JY阅读 247评论 0 2