NSString内存分配,以及深拷贝与浅拷贝

先上俩图

图1-----str2赋值短
图二--str2赋值长

从上面两图对比,先看四种创建方式的不同:

 1.  @“” 和 initWithString:方法生成的字符串分配在常量区,系统自动管理内存;(initWithString不建议使用了,跟直接赋值一样,略显多余了)
 2. initWithFormat:和 stringWithFormat: 方法生成的字符串分配在堆区,autorelease,不用管内存问题,系统自已管理。(一个是实例方法一个是类方法)

str1与str3就没什么要说明的了,都是在常量区。重点是第二张图,当我们赋值 @“123” 时str2余str4是指向的内存地址一样的,当时当我们赋长一点儿的字符串时,两个地址就变得不同了,分析原因:

因为str2与str4,在赋值@“123”时,他们的类型都是NSTaggedPointerString,如果换成较长的字符串,str2与str4的类型就不是NSTaggedPointerString而是__NSCFString,所以地址两个地址就发生了变化,如图二可看出。

猜测原因:可能是对initWithFormat而言,会根据拼接字符串的长度来决定是否进行优化,具体的看采用Tagged Pointer的字符串

NSString真的是很复杂的东西,可能分配在栈区、堆区、常量区,NSTaggedPointerString根本不是对象,是分配在栈区的。

至于引用计数器的问题,当赋值@“123”时,这个到是没什么异议,但是当长字符串后,str2与str4计数器就发生了变化。查了一下原因,说是CFGetRetainCount((__bridgeCFTreeRef)(str1)),str1)会让引用计数器+1,可是即使这样那str4应该也是2啊,为什么两个不相同搞的懵逼,有知道得请告诉我一下,谢谢!


NSString为何要用copy?而不是strong?

为了防止mutable string被无意中修改, NSMutableString是NSString的子类, 因此NSString指针可以持有NSMutableString对象.

深拷贝与浅拷贝

示例代码
控制台输出

你可能感兴趣的:(NSString内存分配,以及深拷贝与浅拷贝)