copy和mutableCopy方法简单认识

来源:互联网 发布:xampp默认数据库密码 编辑:程序博客网 时间:2024/05/29 12:12
////  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;}

0 0
原创粉丝点击