针对NSString的copy修饰前后,引用计数的变化

 1         NSLog(@"NSString的对象,用NSString来接---------------------------------");
 2         NSString *string1 = [[NSString alloc]initWithFormat:@"不可变字符串"];
 3         NSLog(@"copy前,不可变字符串的引用计数 = %ld", [string1 retainCount]);
 4
 5         NSString *copyString1 = string1.copy;
 6         NSLog(@"copy后,不可变字符串的引用计数 = %ld", [string1 retainCount]);
 7         NSLog(@"copy后,copyString的引用计数 = %ld", [copyString1 retainCount]);
 8
 9         NSLog(@"%p", string1);
10         NSLog(@"%p", copyString1);
11         NSLog(@"NSMutableString的对象,用NSMutableString来接---------------------------------");
12         NSMutableString *string2 = [[NSMutableString alloc]initWithFormat:@"可变字符串"];
13         NSLog(@"copy前,可变字符串的引用计数 = %ld", [string2 retainCount]);
14
15         NSMutableString *copyString2 = string2.copy;
16         NSLog(@"copy后,可变字符串的引用计数 = %ld", [string2 retainCount]);
17         NSLog(@"copy后,copyString的引用计数 = %ld", [copyString2 retainCount]);
18
19         NSLog(@"%p", string2);
20         NSLog(@"%p", copyString2);
21         NSLog(@"NSString的对象,用NSMutableString来接---------------------------------");
22         NSString *string3 = [[NSString alloc]initWithFormat:@"不可变字符串"];
23         NSLog(@"copy前,不可变字符串的引用计数 = %ld", [string3 retainCount]);
24
25         NSMutableString *copyString3 = string3.copy;
26         NSLog(@"copy后,不可变字符串的引用计数 = %ld", [string3 retainCount]);
27         NSLog(@"copy后,copyString的引用计数 = %ld", [copyString3 retainCount]);
28
29         NSLog(@"%p", string3);
30         NSLog(@"%p", copyString3);
31         NSLog(@"NSMutableString的对象,用NSString来接---------------------------------");
32         NSMutableString *string4 = [[NSMutableString alloc]initWithFormat:@"可变字符串"];
33         NSLog(@"copy前,可变字符串的引用计数 = %ld", [string4 retainCount]);
34
35         NSString *copyString4 = string4.copy;
36         NSLog(@"copy后,可变字符串的引用计数 = %ld", [string4 retainCount]);
37         NSLog(@"copy后,copyString的引用计数 = %ld", [copyString4 retainCount]);
38
39         NSLog(@"%p", string4);
40         NSLog(@"%p", copyString4);

先来看看上面的运行结果,都打印出什么: 1 2016-06-15 11:39:06.411 OCLession9[1810:63941] NSString的对象,用NSString来接---------------------------------

 2 2016-06-15 11:39:06.411 OCLession9[1810:63941] copy前,不可变字符串的引用计数 = 1
 3 2016-06-15 11:39:06.411 OCLession9[1810:63941] copy后,不可变字符串的引用计数 = 2
 4 2016-06-15 11:39:06.411 OCLession9[1810:63941] copy后,copyString的引用计数 = 2
 5 2016-06-15 11:39:06.411 OCLession9[1810:63941] 0x100202740
 6 2016-06-15 11:39:06.411 OCLession9[1810:63941] 0x100202740
 7 2016-06-15 11:39:06.412 OCLession9[1810:63941] NSMutableString的对象,用NSMutableString来接---------------------------------
 8 2016-06-15 11:39:06.412 OCLession9[1810:63941] copy前,可变字符串的引用计数 = 1
 9 2016-06-15 11:39:06.412 OCLession9[1810:63941] copy后,可变字符串的引用计数 = 1
10 2016-06-15 11:39:06.412 OCLession9[1810:63941] copy后,copyString的引用计数 = 1
11 2016-06-15 11:39:06.412 OCLession9[1810:63941] 0x100300840
12 2016-06-15 11:39:06.412 OCLession9[1810:63941] 0x100300810
13 2016-06-15 11:39:06.412 OCLession9[1810:63941] NSString的对象,用NSMutableString来接---------------------------------
14 2016-06-15 11:39:06.412 OCLession9[1810:63941] copy前,不可变字符串的引用计数 = 1
15 2016-06-15 11:39:06.412 OCLession9[1810:63941] copy后,不可变字符串的引用计数 = 2
16 2016-06-15 11:39:06.412 OCLession9[1810:63941] copy后,copyString的引用计数 = 2
17 2016-06-15 11:39:06.412 OCLession9[1810:63941] 0x100106f90
18 2016-06-15 11:39:06.412 OCLession9[1810:63941] 0x100106f90
19 2016-06-15 11:39:06.413 OCLession9[1810:63941] NSMutableString的对象,用NSString来接---------------------------------
20 2016-06-15 11:39:06.413 OCLession9[1810:63941] copy前,可变字符串的引用计数 = 1
21 2016-06-15 11:39:06.413 OCLession9[1810:63941] copy后,可变字符串的引用计数 = 1
22 2016-06-15 11:39:06.413 OCLession9[1810:63941] copy后,copyString的引用计数 = 1
23 2016-06-15 11:39:06.413 OCLession9[1810:63941] 0x1006002f024 2016-06-15 11:39:06.413 OCLession9[1810:63941] 0x100600210

结论:对字符串,只有对不可变字符串的不可变拷贝才是浅拷贝,其余的都是深拷贝。

时间: 2024-08-26 09:20:45

针对NSString的copy修饰前后,引用计数的变化的相关文章

ARC-环境下如何查看引用计数的变化

一,新建立一个工程,用于测试引用计数的变化. 二,找到如下路径Build Phases---->Compile Sources---->AppDelegate.m 三,选中AppDelegate.m文件,如图所示. 四,将AppDelegate.m的Compiler Flags设置为"-fno-objc-arc".如图所示. 这是因为我们要在AppDelegate.m文件中写我们的测试的代码.而工程默认是ARC管理内存的.所以,我们将其用参数"-fno-objc-

NSString用copy修饰的原因

一言以蔽之:为了安全! 当一个可变字符串(NSMutableString)赋值给一个字符串属性(无论这个字符串是NSString还是NSMutableString), 如果此属性是retain修饰的,就是浅拷贝,引用计数加1.赋值后源字符串改变,这个属性值也跟着改变. 如果此属性是copy修饰的,就是深拷贝,引用计数等于1(因为从堆里新分配一个内存块).赋值后源字符串改变,这个属性值不会改变.(保证了安全) 假设对象有下面4个属性: 1 @property (retain, nonatomic)

《Objective-C 高级编程》干货三部曲(一):引用计数篇

总结了Effective Objective-C之后,还想读一本进阶的iOS书,毫不犹豫选中了<Objective-C 高级编程>: 这本书有三个章节,我针对每一章节进行总结并加上适当的扩展分享给大家.可以从下面这张图来看一下这三篇的整体结构: 注意,这个结构并不和书中的结构一致,而是以书中的结构为参考,稍作了调整. 本篇是第一篇:引用计数,简单说两句: Objective-C通过 retainCount 的机制来决定对象是否需要释放. 每次runloop迭代结束后,都会检查对象的 retai

OC - 引用计数探讨

<Objective-C 高级编程> 这本书有三个章节,我针对每一章节进行总结并加上适当的扩展分享给大家.可以从下面这张图来看一下这三篇的整体结构: 注意,这个结构并不和书中的结构一致,而是以书中的结构为参考,稍作了调整. 本篇是第一篇:引用计数,简单说两句: Objective-C通过 retainCount 的机制来决定对象是否需要释放. 每次runloop迭代结束后,都会检查对象的 retainCount,如果retainCount等于0,就说明该对象没有地方需要继续使用它,可以被释放掉

你相信吗??Python把数字也当做对象!@@@对象,名称绑定,引用计数

本文学习自:http://blog.csdn.net/yockie/article/details/8474408 1.对象 Python中, 万物皆对象,包括12345等int常量.不信吗??用dir()命令看一看就知道 当然了,既然他们都叫做对象.那么肯定有共同点了!所有的对象都有下面的三个特征 * 都有唯一的标识码 id() * 都有确定的类型 * 有内容(或称为值) 一旦对象被创建,标识码就不能更改,对象类型也是不可更改的,内容可以改变(可变对象如dict.list .恒定对象如int.

iOS之NSString类型为什么要用copy修饰

在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是NSString类型的子类,所以可以用指针self.name指向mStr,但是我们知道copy的含义是指当重新赋值时深拷贝新对象再赋值给self.name, 所以此时self.name的指针和mStr的指针指向的对象就不同了,所以当给mStr对象发送方法appendString的时候,修改的只是mSt

iOS内存管理(4)--Block属性用copy修饰 &amp; 避免循环引用的问题

一.Block的类型 根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock. NSGlobalBlock:类似函数,位于text段: NSStackBlock:位于栈内存,函数返回后Block将无效: NSMallocBlock:位于堆内存. 二.Block的copy.retain.release操作 不同于NSObjec的copy.retain.release操作: Block_copy与copy等效,Block_relea

NSString的有意思的引用计数

当我们用alloc 初始化一个对象的时候,这个对象的引用计数为1 .当你不需要它的时候release 来释放它 . NSString *str = [[NSString alloc] initWithString:@"ABC"]; str = @"123"; [str release]; NSLog(@"%@".str); 首先,咱们先对这段代码进行分析. 第一句 声明了一个NSString类型的实例 str, 并将其初始化init后赋值为@&q

OC --(9)-- 内存管理初级:内存管理的方式、引用计数机制,影响计数的各个方法、dealloc方法、内存管理的基本原则、掌握copy的实现

iOS应?程序出现Crash(闪退),90%以上的原因是内存问题. 在一个拥有数十个甚?至是上百个类的?程里,查找内存问题极其困难. 了解内存常?问题,能帮我们减少出错几率. 内存问题体现在两个方面:内存溢出.野指针异常. 1.野指针异常 内存管理的方式 引用计数 影响引用计数的方法有 +alloc -retain -copy -release -autorelease