NSString与NSMutableString的浅拷贝与深拷贝

浅拷贝:指针拷贝,指针与原指针地址相同,没有创建新的对象。

深拷贝:内容拷贝,创建了新的对象,指针地址与原对象的指针地址不同。

NSString测试代码如下

打印结果如下(后面打印出的两个NSCFConstanaString与NSCFString是打印出系统底层实现时调用方法的类)

设置一个断点来鼠标放到变量上查看结果如下

   

从上面左图可以看出copyStr1它的真实类型为不可变字符串,右图可以看出copyStr2为真实类型为可变字符串。从打印地址来看只有最后一个地址不同。

结论:对一个NSString字符串进行copy不会产生新对象(浅拷贝),进行mutableCopy会产生新对象(深拷贝)。

NSMutableString测试代码如下:

打印结果如下:

鼠标查看真实类型如下:

  

从上面左图可以看出copyStr1它的真实类型为不可变字符串,右图可以看出copyStr2为真实类型为可变字符串。从打印地址来看都生成了新对象。

结论:对一个NSMutableString字符串进行copy会产生新对象(深拷贝),进行mutableCopy会产生新对象(深拷贝)。copy产生的新对象为NSString类型,mutableCopy产生的新对象为NSMutableString类型。

 

最后这里出现了如__NSCFString,__NSCFConstantString,NSTaggedPointerString等一些类型,这是系统底层自动字字符串分配选择的类型。下面是我从网上搜到的一些情况。

NSString抽象工厂:

NSString 是 NSCFString的父类

在于NSString是个class cluster,一个类簇。什么是一个类簇?简单的来说,NSString是个“工厂类”,然后它在外层提供了很多方法接口,但是这些方法的实现是由具体 的内部类来实现的。当使用NSString生成一个对象时,初始化方法会判断哪个“自己内部的类”最适合生成这个对象,然后这个“工厂”就会生成这个具体 的类对象返回给你。这种又外层类提供统一抽象的接口,然后具体实现让隐藏的,具体的内部类来实现,在设计模式中称为“抽象工厂”模式。

  Tagged Pointer是一个能够提升性能、节省内存的有趣的技术。在OS X 10.10中,NSString就采用了这项技术。对象在内存中是对齐的,它们的地址总是指针大小的整数倍,通常为16的倍数。对象指针是一个64位的整数,而为了对齐,一些位将永远是零。Tagged Pointer利用了这一现状,它使对象指针中非零位有了特殊的含义。在苹果的64位Objective-C实现中,若对象指针的最低有效位为1(即奇数),则该指针为Tagged Pointer。这种指针不通过解引用isa来获取其所属类,而是通过接下来三位的一个类表的索引。该索引是用来查找所属类是采用Tagged Pointer的哪个类。剩下的60位则留给类来使用。

具体的关于__NSCFString与__NSCFConstantString,网上发现一篇分析实在是写得很好,并测试了引用计数的分析情况,链接如下。

http://www.360doc.com/content/15/0304/17/9200790_452525916.shtml

时间: 2024-11-09 07:37:17

NSString与NSMutableString的浅拷贝与深拷贝的相关文章

copy和mutableCopy到底是浅拷贝还是深拷贝?

请尊重原作者的辛苦劳动,转载请注明出处.http://blog.csdn.net/jslsblog/article/details/38563009 实践是检验真理的唯一标准.下面就让我们在实践中认识copy和mutableCopy的共同点和区别. 1.copy和mutableCopy的实现过程. 想要一个对象能实现copy首先要继承NSCopying的协议,然后实现+ (id)copyWithZone:(struct _NSZone *)zone,mutableCopy对应的是NSMutabl

iOS基础-NSString及NSMutableString剖析

一.NSString头文件 NSString : NSObject 实现协议: NSCopying/NSMutableCopying/NSSecureCoding 类别: //扩展类别 NSString (NSStringExtensionMethods) //此API是用来检测给定原始数据的字符串编码 NSString (NSStringEncodingDetection) NSMutableString : NSString 类别: //可以实现子类的原始replaceCharactersI

IOS的浅拷贝和深拷贝

什么是深拷贝和浅拷贝 浅拷贝:就是指针的复制,拷贝的指针跟原指针指向内存中的同一个位置的对象.至于对象的引用计数值是否+1,就是看拷贝的指针赋给给的变量是Strong类型的,还是week类型的. 如果是 strong类型,那么被拷贝的对象的内存计数值会+1,如果赋值给了weak类型的变量,那么被拷贝的对象的内存计数值会保持不便. 深拷贝:将内存中的对象拷贝一份,放到一个新的位置,并将这个指向这个新位置的指针指赋值给另外一个变量. 判断拷贝类型,关键的依据是指针所指向的对象在内存中的地址. IOS

Objective-c中对象的Copy、MutableCopy、浅拷贝、深拷贝

对象的复制就是复制一个对象作为副本,他会开辟一块新的内存(堆内存)来存储副本对象,就像复制文件一样,即源对象和副本对象是两块不同的内存区域.对象要具备复制功能,必须实现<NSCopying>协议或者<NSMutableCopying>协议,常用的可复制对象有:NSNumber.NSString.NSMutableString.NSArray.NSMutableArray.NSDictionary.NSMutableDictionary copy:产生对象的副本是不可变的 mutab

浅拷贝,深拷贝---ios

#import <Foundation/Foundation.h> @interface Father : NSObject <NSCopying,NSMutableCopying> @property (nonatomic,copy) NSString *name; @property (nonatomic,retain) NSNumber *age; -(id) initWithName:(NSString *)name withAge:(NSNumber *) age; @e

Object-C的浅拷贝与深拷贝区别

1.要了解浅拷贝与深拷贝,首要的是理解浅拷贝是什么,深拷贝是什么. <1>浅拷贝:就相当于retain,只copy了一个对象的引用,和本身是同一个对象,就相当于影子. <2>深拷贝:从新开辟了一块内存空间,用来存放原来对象里面的东西,这个时候,copy出来的对象和原来的对象不是同一个对象,他们的内容一样,就相当于克隆人. <3>拷贝出来的的对象是什么类型取决于使用什么拷贝. 2.拷贝的用法 <1>不可变copy拷贝不可变对象(浅拷贝): NSArray *a

NSString和NSMutableString 的常见用法

NSString类是我们经常使用的类,这里对其用途及常用的一些方法做一些归类. 1>字符串的创建 NSString *str = @"字符串内容“;   //直接使用字符串常量的赋值方式 NSString *str = [NSString alloc ] init];   //创建一个空的字符串对象 NSString *str = [NSString stringWithFormat: @""];  //使用类方法的格式化创建方式来创建字符串 NSString *str

【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝

对象的拷贝分为浅拷贝和深拷贝,浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址,深拷贝则相当于不仅拷贝了一个对象还拷贝了它的属性,即完全是两个东西,只不过内容相同而已. 拷贝用到协议,如果这个类创建对象后,这个对象要被拷贝,那么这个类就需要用到拷贝协议,分两种:<NSCopying>和<NSMutableCopying>相当于一个是拷贝,另一个是拷贝后可修改. (1)浅拷贝的案例.有一个Person类,它创建一个person1对象后,用

js对象浅拷贝和深拷贝详解

js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var