IOS深浅Copy

御用占位图:


IMG_2006.JPG
#import "CopyAndMutableCopyVC.h"

@interface CopyAndMutableCopyVC ()

@end

@implementation CopyAndMutableCopyVC

- (void)viewDidLoad {
    [super viewDidLoad];
    //非集合对象
    NSString *str = @"jkjskdjks";
    NSString *copyStr = [str copy];
    NSLog(@"str指针指向的对象的地址==%p,str指针的值==%p",str,&str);
    NSLog(@"copyStr指针指向的对象的地址==%p,copyStr指针的值==%p",copyStr,©Str);
    /*
     输出结果:
     str指针指向的对象的地址     ==0x109fb7f70,str指针的值     ==0x7ffee5e283f8
     copyStr指针指向的对象的地址 ==0x109fb7f70,copyStr指针的值 ==0x7ffee5e283f0
     结论:对象的内存地址没变,指针地址发生了改变,只拷贝了指针,既:浅拷贝。
     */
    
    NSMutableString *muStr = [NSMutableString stringWithFormat:@"dshjdks"];
    NSString *copyMuStr = [muStr copy];
    NSLog(@"muStr指针指向的对象的地址==%p,muStr指针的值==%p",muStr,&muStr);
    NSLog(@"copyMuStr指针指向的对象的地址==%p,copyMuStr指针的值==%p",copyMuStr,©MuStr);
    /*
     输出结果:
     muStr指针指向的对象的地址        ==0x600000649240,muStr指针的值          ==0x7ffeed4173e8
     copyMuStr指针指向的对象的地址    ==0xa736b646a6873647,copyMuStr指针的值  ==0x7ffeed4173e0
     结论:对象的内存地址改变,指针地址发生了改变,既:深拷贝。
     */
    
    
    NSString *str2 = @"jkjskswrewdjks";
    NSString *copyStr2 = [str2 mutableCopy];
    NSLog(@"str2指针指向的对象的地址==%p,str2指针的值==%p",str2,&str2);
    NSLog(@"copyStr2指针指向的对象的地址==%p,copyStr2指针的值==%p",copyStr2,©Str2);
    /*
     输出结果:
     str2指针指向的对象的地址         ==0x1084cb030,str2指针的值          ==0x7ffee79163d8
     copyStr2指针指向的对象的地址     ==0x60400044b940,copyStr2指针的值   ==0x7ffee79163d0
     结论:对象的内存地址改变,指针地址发生了改变,既:深拷贝。
     */
    
    NSMutableString *muStr2 = [NSMutableString stringWithFormat:@"dshjsddsddks"];
    NSString *copyMuStr2 = [muStr2 mutableCopy];
    NSLog(@"muStr2指针指向的对象的地址==%p,muStr2指针的值==%p",muStr2,&muStr2);
    NSLog(@"copyMuStr2指针指向的对象的地址==%p,copyMuStr2指针的值==%p",copyMuStr2,©MuStr2);
    /*
     输出结果:
     muStr2指针指向的对象的地址       ==0x6040002455b0,muStr2指针的值     ==0x7ffee79163c8
     copyMuStr2指针指向的对象的地址   ==0x604000250da0,copyMuStr2指针的值 ==0x7ffee79163c0
     结论:对象的内存地址改变,指针地址发生了改变,既:深拷贝。
     */
    //结论:
    //1.对于可变字符串不论是copy还是mutableCopy 都是深拷贝;
    //2.非可变字符串,copy为浅拷贝,mutableCopy是深拷贝。
    //3.mutableCopy都是深拷贝。copy需要区分是可变字符串和非可变字符串。
    
    //集合对象
    NSArray *array = @[@"sds",@"ew",@"232"];
    NSArray *copyArray = [array copy];
    NSLog(@"array指针指向的对象的地址==%p,array指针的值==%p",array,&array);
    NSLog(@"copyArray指针指向的对象的地址==%p,copyArray指针的值==%p",copyArray,©Array);
    /*
     array指针指向的对象的地址        ==0x60400044f060,array指针的值      ==0x7ffee11ed380
     copyArray指针指向的对象的地址    ==0x60400044f060,copyArray指针的值  ==0x7ffee11ed378
     结论:对象的地址没有改变,指针地址改变,既:浅拷贝
     */
    NSMutableArray *muArray = [NSMutableArray arrayWithObjects:@"wefs",@"werwq",@"dfdt", nil];
    NSMutableArray *copyMuArray = [muArray copy];
    NSLog(@"muArray指针指向的对象的地址==%p,muArray指针的值==%p",muArray,&muArray);
    NSLog(@"copyMuArray指针指向的对象的地址==%p,copyMuArray指针的值==%p",copyMuArray,©MuArray);
    /*
     muArray指针指向的对象的地址      ==0x60400044eb80,muArray指针的值        ==0x7ffee11ed370
     copyMuArray指针指向的对象的地址  ==0x60400044ecd0,copyMuArray指针的值    ==0x7ffee11ed368
     结论:对象和指针的地址都发生了改变,既:单层深拷贝
     */
    NSArray *array2 = @[@"dsaf",@"wewr",@"vserty"];
    NSArray *copyArray2 = [array2 mutableCopy];
    NSLog(@"array2指针指向的对象的地址==%p,array2指针的值==%p",array2,&array2);
    NSLog(@"copyArray2指针指向的对象的地址==%p,copyArray2指针的值==%p",copyArray2,©Array2);
    /*
     rray2指针指向的对象的地址        ==0x604000654340,array2指针的值     ==0x7ffee11ed360
     copyArray2指针指向的对象的地址   ==0x604000653fb0,copyArray2指针的值 ==0x7ffee11ed358
     结论:对象和指针的地址都发生了改变,既:单层深拷贝
     */
    NSMutableArray *muArray2 = [NSMutableArray arrayWithObjects:@"wesfs",@"werwqe",@"dfdtf", nil];
    NSMutableArray *copyMuArray2 = [muArray2 mutableCopy];
    NSLog(@"muArray2指针指向的对象的地址==%p,muArray2指针的值==%p",muArray2,&muArray2);
    NSLog(@"copyMuArray2指针指向的对象的地址==%p,copyMuArray2指针的值==%p",copyMuArray2,©MuArray2);
    /*
     muArray2指针指向的对象的地址     ==0x60400044ed00,muArray2指针的值       ==0x7ffee11ed350
     copyMuArray2指针指向的对象的地址 ==0x604000654a30,copyMuArray2指针的值   ==0x7ffee11ed348
     结论:对象和指针的地址都发生了改变,既:单层深拷贝

     */
    NSString *first = [muArray2 objectAtIndex:0];
    NSString *first2 = [copyMuArray2 objectAtIndex:0];
    
    NSLog(@"first指针指向的对象的地址==%p,first指针的值==%p",first,&first);
    NSLog(@"first2指针指向的对象的地址==%p,first2指针的值==%p",first2,&first2);
    /*
     first指针指向的对象的地址        ==0x105f892d0,first指针的值     ==0x7ffee9e58340
     first2指针指向的对象的地址       ==0x105f892d0,first2指针的值    ==0x7ffee9e58338
     结论:单层深拷贝,没有拷贝内容,只是拷贝了指针。
     */
    //结论和字符串的结论类似:
    //1.对于可变数组不论是copy还是mutableCopy 都是单层深拷贝;
    //2.非可变数组,copy为浅拷贝,mutableCopy是单层深拷贝。
    //3.mutableCopy都是单层深拷贝。copy需要区分可变数组和非可变数组。
    
    //注意:上面有“浅拷贝”、“深拷贝”、“单层深拷贝”这三个不同的描述,浅拷贝和深拷贝相对容易理解一些,但是“单层深拷贝”是什么呢,有兴趣的同学可以打印下“单层深拷贝”数组的内容,你会发现数组里面的内容只是指针拷贝,并没有进行内容的拷贝,所以称为“单层深拷贝”
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end

验证下:“单层深拷贝”,可以看到mutableCopy后的数组的地址发生了改变,但是里面的内容没有改变,还是指针copy

2C809926-B3A6-4A4F-BB23-CBC8647FBDCC.png

你可能感兴趣的:(IOS深浅Copy)