iOS copy和mutablecopy

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012490014/article/details/80282922

    就单纯的自己定义的类来说,copy和mutablecopy,与浅拷贝和深拷贝没有什么关系,关键是自己怎么实现NSCopying和NSMutableCopying这两个协议,如果协议实现的的时候只是拷贝指针,那就是浅拷贝,如果又申请一块内存并且把内容复制,那就是深拷贝,但是对于系统自带的容器类和NSString就要另外分了,因为协议的实现我们是看不到的,所以只能测试

NSString

首先测试NSString

- (void)testStr{
    
    NSString *str = @"isjifsfjlsf";
    
    NSString *str2 = [str copy];
    NSString *str3 = [str mutableCopy];
    NSLog(@"str:%@,%p\nstr2:%@,%p\nstr3:%@,%p",str,str,str2,str2,str3,str3);
    
}

结果:

str:isjifsfjlsf,0x102655078
str2:isjifsfjlsf,0x102655078
str3:isjifsfjlsf,0x6000002551b0
结果可以看出对于NSString来说copy只是拷贝的指针,而mutablecopy指针是不一样的内容一样所以是深拷贝


再来测试一下NSMutableString

- (void)testMutableStr{
    
    NSMutableString* str = [[NSMutableString alloc]initWithString:@"hsjjdsjfjsfs"];
    
    NSString *str2 = [str copy];
    NSString *str3 = [str mutableCopy];
    NSLog(@"\nstr:%@,%p\nstr2:%@,%p\nstr3:%@,%p",str,str,str2,str2,str3,str3);
    
}

结果:

str:hsjjdsjfjsfs,0x6040004468a0
str2:hsjjdsjfjsfs,0x60400043dfc0
str3:hsjjdsjfjsfs,0x604000446210

对于NSMutableString来说copy和mutablecopy都是深拷贝

系统容器类

拿数组来测试,先测试NSArray

- (void)testArr{
    
    NSArray* arr = @[@"1",@"2",@"3"];

    NSArray *arr1 = [arr copy];
    NSArray *arr2 = [arr mutableCopy];
    NSLog(@"arr:%p,arr1:%p,arr2:%p",arr,arr1,arr2);
 

}

结果:

arr:0x6000004512b0,arr1:0x6000004512b0,arr2:0x60000044fab0

NSArray和NSString类似,copy是浅拷贝而mutablecopy是深拷贝

测试一下NSMutableArray

- (void)testMutableArr{
    NSMutableArray* arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
    
    NSArray *arr1 = [arr copy];
    NSArray *arr2 = [arr mutableCopy];
    NSLog(@"arr:%p,arr1:%p,arr2:%p",arr,arr1,arr2);

}

结果:

arr:0x604000646540,arr1:0x604000646780,arr2:0x604000646480
NSMutableArray和NSMutableString类似,copy和mutablecopy都是深拷贝


猜你喜欢

转载自blog.csdn.net/u012490014/article/details/80282922
今日推荐