oc这门语言属于奇葩中的奇葩,基本类型的对象分为“可变”类型与“不可变”类型。
比如下面这些类型
可变 | 不可变 |
---|---|
NSArray | NSMutableArray |
NSString | NSMutableString |
NSNumber | NSMutableNumber |
… | … |
可变类型可以看作是“变量”,不可变类型可以看作是“常量”。当然,只是表面上比较像。
两种类型都是NSObject
的子类,都实现了NSObject
中的mutableCopy
与copy
方法。
有关这两种方法,Apple是这样介绍的:
在oc中 copy和mutableCopy两个方法是被所有对象(继承自NSObject的类)继承的,这两个方法就是为copy准备的。其中,mutableCopy是为了创建原始对象的可变类型的copy。这两个方法分别调用copyWithZone和mutableCopyWithZone两个方法来进行copy。一个类必须实现copyWithZone或者mutableCopyWithZone,才能进行copy或者mutableCopy。
两种类型(可变、不可变),两种方法(mutableCopy、copy),就产生了四种组合:
- 可变类型调用copy
- 可变类型调用mutableCopy
- 不可变类型调用copy
- 不可变类型调用mutableCopy
这四种组合衍生出了两种概念,浅拷贝
与深拷贝
:
- 浅copy: 指针复制,不会创建一个新的对象。
- 深copy: 内容复制,会创建一个新的对象。
概念太空,用代码来理解:
#import <Foundation/Foundation.h>
int main(int args, const char *argv[]) {
@autoreleasepool