探讨NSString在哪个内存区

 1     NSString *str = [[NSString alloc] initWithFormat:@"不可变"];//在堆区
 2     NSLog(@"p = %p; str = %ld",str, [str retainCount]);//
 3
 4     self.retainStr  = str;// 浅拷贝。引用计数 +1
 5     NSLog(@"p = %p; self.retainStr = %ld",self.retainStr,[self.retainStr retainCount]);//
 6     self.copyStr    = str;// 浅拷贝。引用计数再 +1
 7     NSLog(@"p = %p; self.copyStr = %ld",self.copyStr,[self.copyStr retainCount]);
 8
 9     self.retainMStr = [str mutableCopy];// 深拷贝。mutableCopy,引用计数 +1;retain,再 +1。
10     NSLog(@"p = %p; self.retainMStr = %ld",self.retainMStr,[self.retainMStr retainCount]);
11     self.copyMStr   = [str mutableCopy];// 深拷贝。mutableCopy,引用计数 +1;copy,不增加。
12     NSLog(@"p = %p; self.copyMStr = %ld",self.copyMStr,[self.copyMStr retainCount]);
13
14
15
16     NSLog(@"-------------------------------");
17
18     NSMutableString *mutableStr = [[NSMutableString alloc] initWithFormat:@"可变字符串"];//在堆区
19     NSLog(@"p = %p; mutableStr = %ld",mutableStr, [mutableStr retainCount]);//
20
21     self.retainStr  = mutableStr;// 单纯地持有。所以,与mutableStr同地址。引用计数 +1
22     NSLog(@"p = %p; self.retainStr = %ld",self.retainStr, [self.retainStr retainCount]);//
23     self.copyStr    = mutableStr;// 深拷贝。与mutableStr不同地址,引用计数 =1
24     NSLog(@"p = %p; self.copyStr = %ld",self.copyStr, [self.copyStr retainCount]);
25
26     self.retainMStr = mutableStr;// 单纯地持有。所以,与mutableStr同地址。引用计数再 +1
27     NSLog(@"p = %p; self.retainMStr = %ld",self.retainMStr, [self.retainMStr retainCount]);
28     self.copyMStr   = mutableStr;// 深拷贝。与mutableStr和self.copyStr的地址皆不同,引用计数 =1
29     NSLog(@"p = %p; self.copyMStr = %ld",self.copyMStr, [self.copyMStr retainCount]);
 1 2016-06-16 16:15:32.015 OCLession9[10611:174179] p = 0x100600960; str = 1
 2 2016-06-16 16:15:32.015 OCLession9[10611:174179] p = 0x100600960; self.retainStr = 2
 3 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x100600960; self.copyStr = 3
 4 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x100300350; self.retainMStr = 2
 5 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x1003003e0; self.copyMStr = 1
 6 2016-06-16 16:15:32.016 OCLession9[10611:174179] -------------------------------
 7 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x1003004b0; mutableStr = 1
 8 2016-06-16 16:15:32.016 OCLession9[10611:174179] p = 0x1003004b0; self.retainStr = 2
 9 2016-06-16 16:15:32.017 OCLession9[10611:174179] p = 0x100203ae0; self.copyStr = 1
10 2016-06-16 16:15:32.017 OCLession9[10611:174179] p = 0x1003004b0; self.retainMStr = 3
11 2016-06-16 16:15:32.017 OCLession9[10611:174179] p = 0x100203b10; self.copyMStr = 1

堆区:NSString *str = [[NSString alloc] initWithFormat:@"不可变"];//其中有汉字,是unicode,所以在堆区

常量区:NSString *str = [[NSString alloc] initWithFormat:@"123abc"];//纯在Ascll码,例如字母与数字的混合,编译器会在编译期用“悬垂指针”对其进行优化。可理解为在常量区。反正引用计数对此失效。

常量区:NSString *str = @"我来了";//[[NSString alloc] initWithString:@"我来了"];//两种方式都一样。都在常量区

时间: 2024-08-25 21:16:19

探讨NSString在哪个内存区的相关文章

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

NSString初始化及其内存管理

1. NSString 3种初始化方法 a. 直接赋值: NSString *str = @"a string", 这种方式使用常量内存. b. 使用类方法: NSString *str = [NSString stringWithString:@"a string"];    NSString * str = [NSString stringWithFormat:@"age is %i, height is %f", 20, 180]; c.

Linux环境编程之共享内存区(一):共享内存区简介

Spark生态圈,也就是BDAS(伯克利数据分析栈),是伯克利APMLab实验室精心打造的,力图在算法(Algorithms).机器(Machines).人(People)之间通过大规模集成,来展现大数据应用的一个平台,其核心引擎就是Spark,其计算基础是弹性分布式数据集,也就是RDD.通过Spark生态圈,AMPLab运用大数据.云计算.通信等各种资源,以及各种灵活的技术方案,对海量不透明的数据进行甄别并转化为有用的信息,以供人们更好的理解世界.Spark生态圈已经涉及到机器学习.数据挖掘.

Linux环境编程之共享内存区(二):Posix共享内存区

现在将共享内存区的概念扩展到将无亲缘关系进程间共享的内存区包括在内.Posix提供了两种在无亲缘关系进程间共享内存区的方法: 1.内存映射文件:由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件.(上一节就是这种技术) 2.共享内存区对象:由shm_open打开一个Posix名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址空间.(本节内容) Posix共享内存区涉及以下两个步骤要求: 1.指定一个名字参数调用shm_open

system v 共享内存区

#include<sys/shm.h> int shmget(key_t key,size_t size,int oflag);    返回:成功则为共享内存区对象,出错为-1 key 的值可以是ftok的返回值,也可以是IPC_PRIVATE. ftok()               是非亲缘进程间 IPC_PRIVATE         是亲缘进程间的 size以字节为单位指定内存区的大小.当实际操作为创建一个新的共享内存区时,必须指定一个不为0的size值.如果实际操作为访问一个已存在

进程间通信(三)&mdash;&mdash;共享内存区

1.概述 共享内存区是IPC中最快的,当内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核. 但是这需要某种形式的同步,最常用的是信号量. 不再涉及内核:进程不再通过执行任何进入内核的系统调用来彼此传递数据.内核必须建立允许各个进程共享该内存区的内存映射关系,然后一值管理该内存区.   管道,FIFO和消息队列的问题是,两个进程要交换信息时,这些信息必须经由内核传递. 共享内存区可以绕过这个问题,但是一般必须同步数据.   使用内存映射文件的特性,所有的I/O都不再有内核直接参与

Linux 进程通信(共享内存区)

共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也立即会看到更新. 由一个进程创建的段,也可以由另一个进程读写. 每个进程都把它自己对共享内存的映像放入自己的地址空间. 创建共享内存区 int shmget(key_t key,size_t size,int shm-flg); 参数key既可以是IPC_PRIVATE(IPC_PRIVATE表示让

共享内存区

共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. mmap函数 功能:将文件或者设备空间映射到共享内存区. 原型 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 参数 addr: 要映射的起始地址,通常指定为NULL,让内核自动选择 len:映射到进程地址空间的字节数

UNIX网络编程:共享内存区

IPC形式除了管道.FIFO.信号量以外,还有共享内存区和消息队列.这里主要堆共享内存进行介绍. 共享内存区是可用IPC形式中最快的.一旦这样的内存区映射到共享它的进程地址空间,这些进程间数据的传递就不再涉及内核.共享内存与其他进程通信方式相比较,不需要复制数据,直接读写内存,是一种效率非常高的进程通信方案.但它本身不提供同步访问机制,需要我们自己控制.在LINUX中,只要把共享内存段连接到进程的地址空间中,这个进程就可以访问共享内存中的地址了.为了实现往该共享内存区存放和取出数据的进程间的同步