IOS-UI高级之深浅拷贝

1、深拷贝(mutableCopy)

深拷贝也称内容拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。即产生一个新的对象,mutableCopy返回的对象都是可变的


2、浅拷贝(copy)
浅拷贝也叫指针拷贝或者地址拷贝,即把一个指针拷贝一份指向另一个对象,没有产生新对象
但是copy返回的对象是不可变的
例子(NSString):


NSString *string = @"lzh";
        NSString *str1 = [string copy];
        
        NSMutableString *str2 = [string mutableCopy];
        [str2 appendString:@"520"];
        
        NSLog(@"string的地址: %p str1的地址: %p str2的地址:%p",string,str1,str2);
        NSLog(@"string内容:%@,str1内容:%@,str2内容:%@",string,str1,str2);

运行结果:

NSString通过浅拷贝把地址复制一份给str1,所以string和str1的地址是一样的,并且str1是不可变的;而string通过深拷贝出来的str2,是系统创建出来的一个新对象,并且str2是可变的,可以随意添加新的内容。



(NSMutableString)
NSMutableString *string = [NSMutableString string];
        [string appendString:@"love"];
        [string appendString:@"study"];
        NSString *str1 = [string copy];
        
        NSMutableString *str2 = [string mutableCopy];
        [str2 appendString:@"happy"];
        
        NSLog(@"string的地址: %p str1的地址: %p str2的地址:%p",string,str1,str2);
        NSLog(@"string内容:%@,str1内容:%@,str2内容:%@",string,str1,str2);
运行结果:

NSMutableString类型的string不管是通过浅拷贝(copy)还是深拷贝(mutableCopy)产生对象的地址都是不一样的,即都产生了一个新对象,所以都属于深拷贝。
由此可知只有NSString类型通过浅复制(copy)才是浅拷贝,其他三种情况都是深拷贝


NSArray *array = @[@"刘诗诗",@"刘亦菲"];
        NSArray *arr1= [array copy];
        
        NSMutableArray *arr2 = [array mutableCopy];
        [arr2 addObject:@"IOS"];
        
        NSLog(@"array的地址: %p arr1的地址: %p arr2的地址:%p",array,arr1,arr2);
        NSLog(@"array内容:%@,arr1内容:%@,arr2内容:%@",array,arr1,arr2);
运行结果:
IOS-UI高级之深浅拷贝_第1张图片
系统的NS*和NSMutable*类型使用copy(浅复制)和mutableCopy(深复制时)都和以上两种差不多(如NSDictionary、NSMutableDictionary)


下面是对象使用复制时的举例(因为对象是可变的所以不需要进行深拷贝,这里就只进行(mutableCopy)浅复制的举例:
Copy *p = [[Copy alloc] init];
        
        p.myName = @"lzh";
        p.myHabbit = @"跑步,听歌";
        
        Copy *p1 = [p copy];
       
        NSLog(@"p的地址:%p,p1的地址:%p",p,p1);
        NSLog(@"p1的内容,name:%@,habbit:%@",p1.myName,p1.myHabbit);


Copy类.m文件中实现NSCoping协议的方法
- (id)copyWithZone:(NSZone *)zone{
    
    Copy *p = [[Copy alloc] init];
    //self指的是该方法调用者(这里为p)
    p.myName = self.myName;
    p.myHabbit = self.myHabbit;
    
    return p;
}


运行结果:

你可能感兴趣的:(IOS-UI高级之深浅拷贝)