//
// main.m
// OC语言学习
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//copy和mutableCopy方法
// NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:@"one",@"two",@"three", nil];
/*
上面使用不可变字符串来填充dataArray的元素(常量字符串对象是不可变的)。
下面使用可变字符串代替它来填充数组,这样就可以改变数组中的一个字符串
*/
NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
[NSMutableString stringWithString:@"one"],
[NSMutableString stringWithString:@"two"],
[NSMutableString stringWithString:@"three"],
nil
];
NSMutableArray *dataArray2;
NSMutableString *mStr;
//复制一份
dataArray2 = [dataArray mutableCopy];
mStr = [dataArray objectAtIndex:0];
[mStr appendString:@"ONE"]; //将字符串追加到这个元素
NSLog(@"%@",dataArray);
NSLog(@"%@",dataArray2[0]);//输出:oneONE (原始数组及其副本中的第一个元素的值都被修改了)
/*
从集合中获取元素时,就得到了这个元素的一个新引用,但并不是一个新副本。
所以,对dataArray调用objectAtIndex:方法时,返回的对象与dataArray中的第1个元素都指向内存中的同一个对象。
*/
//为上面副本的第一个元素也会改变?
/*
这与默认的浅拷贝方式有关。它意味着使用 mutableCopy方法 复制数组时,在内存中为新的数组对象分配了空间,并且将单个元素复制到新数组中。
然而原始数组中的每个元素复制到新位置,仅将引用从一个数组元素复制到另一个数组元素。
*/
//若要为数组中每个元素创建完全不同的副本,应该怎么办?
//答:深拷贝(也叫深复制)
mStr = [NSMutableString stringWithString:[dataArray2 objectAtIndex:0]];
[mStr appendString:@"ONE"];
[dataArray2 replaceObjectAtIndex:0 withObject:mStr];
NSLog(@"dataArray2[0]= %@",dataArray2[0]); //dataArray2[0]= oneONEONE
NSLog(@"dataArray[0]= %@",dataArray[0]); //dataArray[0]= oneONE
//这样只更改了dataArray2的第一个元素
}
return 0;
}
copy和mutableCopy方法简单认识
最新推荐文章于 2018-09-17 14:20:05 发布