copy与mutableCopy方法
copy:
copy方法用于复制对象的副本。通常来讲,copy方法总是返回对象的不可修改的副本,即使该对象本身是可修改的。
mutableCopy:
mutableCopy方法用于复制对象的可变副本。通常来说,mutableCopy方法总是返回该对象可修改的副本,即使被复制的对象本身是不可修改的,调用mutableCopy方法复制出来的副本也是可修改的。
总结:
无论如何,copy和mutableCopy返回的总是原对象的副本,当程序对复制的副本进行修改时,原对象通常不会受到影响。
通过一个小例子来理解
//
// main.m
// 对象复制
//
// Created by 星星leslie on 2019/6/4.
// Copyright © 2019 星星leslie. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableString* book = [NSMutableString stringWithString: @"疯狂iOS讲义"];
//复制book字符串的可变副本
NSMutableString* bookCopy = [book mutableCopy];
//修改副本,对原字符串没有任何影响
[bookCopy replaceCharactersInRange: NSMakeRange(2, 3) withString: @"Android"];
//此处看到原字符串的值没有改变
NSLog (@"%@", book);
//字符串副本发生了改变
NSLog (@"%@", bookCopy);
NSString* str = @"fkit";
//复制str(不可变字符串)的可变副本
NSMutableString* strCopy = [str mutableCopy];
//向可变字符串后面追加字符串
[strCopy appendString: @".org"];
NSLog (@"%@", strCopy);
//调用book(可变字符串)的copy方法,程序返回一个不可修改的副本
NSMutableString* bookCopy2 = [book copy];
//由于bookcopy2是不可修改的,因此下面的代码将会出现错误
[bookCopy2 appendString: @"aa"];
}
return 0;
}
运行结果如下:
由运行结果可以看出,当程序复制对象的副本后,对副本所做的任何修改,对原始对象本身并没有任何影响。