美文网首页
iOS 浅拷贝和深拷贝

iOS 浅拷贝和深拷贝

作者: 7890陈 | 来源:发表于2019-05-28 03:04 被阅读0次

    1、对象拷贝,使用关键字 copy 和 mutableCopy,使用这两个方法即可复制已存在的对象
    自定义类想要具备可复制功能,必须实现NSCopying 或 NSMutableCopy
    copy 返回的是不可变对象,mutableCopy 返回的是可变对象
    让自定义的类具有 copy 和 mutableCopy,这个类需遵守NSCopying、NSMutableCopying协议并实现协议方法
    2、浅拷贝只是复制指向对象的指针,不会开辟新的内存空间,两个指针指向同一块内存空间

    NSArray *array = [NSArray arrayWithObject:@"1"];
    NSLog(@"%p  -- %p",array,[array copy]);
    // 0x6000006f6d30 
    // 0x6000006f6d30
    // %p 打印对象内存地址
    

    3、深拷贝会拷贝对象的具体内容,然后指向一块新的内存地址
    常见的几种例子

    // 第一种情况 
    @property (nonatomic, strong) NSArray *list;
    
    NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
    self.list = array;
    NSLog(@"%@ -- %@",self.list, array);
    NSLog(@"%p -- %p",self.list, array);
    // 数组内容一样,内存地址一样
        
    [array addObject:@"2"];
        
    NSLog(@"%@ -- %@",self.list, array);
    NSLog(@"%p -- %p",self.list, array);
    // 修改数组后,数组内容一样,内存地址也一样
    // 此种情况 为浅拷贝
    
    // 第二种情况 
    @property (nonatomic, copy) NSArray *list;
    
    NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
    self.list = array;
    NSLog(@"%@ -- %@",self.list, array);
    NSLog(@"%p -- %p",self.list, array);
    // 数组内容一样,内存地址不一样
        
    [array addObject:@"2"];
        
    NSLog(@"%@ -- %@",self.list, array);
    NSLog(@"%p -- %p",self.list, array);
    // 修改数组后,数组内容不一样,内存地址也不一样
    // 此种情况为深拷贝
    
    // 第三种情况
    @property (nonatomic, strong) NSMutableArray *list;
    
    NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
    self.list = array;
    NSLog(@"%@ -- %@",self.list, array);
    NSLog(@"\n%p \n%p",self.list, array);
    // 数组内容一样,内存地址一样
        
    [array addObject:@"2"];
        
    NSLog(@"%@ -- %@",self.list, array);
    NSLog(@"\n%p \n%p",self.list, array);
    // 修改数组后,数组内容一样,内存地址也一样
    // 此种情况 为浅拷贝
    

    注意:@property 中可变类型不能使用 copy 修饰,@property 是由 ivar(属性变量) + getter + setter 方法组成的,self.list 会调用 setter 方法,setter 方法中有 _list = [list copy]; 会将可变类型变为不可变类型,self.list 在调用增、删、改等可变对象的方法时,会crash,找不到方法,报错误:unrecognized selector sent to instance 0x600001583330

    // 第四种情况
    NSArray *list = [NSArray arrayWithObject:@"1"];
    NSArray *array = [list copy];
        
    NSLog(@"\n%p\n%p",list,array);
    // 内存地址一样
    // 浅拷贝
    
    // 第五种情况
    NSArray *list = [NSArray arrayWithObject:@"1"];
    NSMutableArray *array = [list mutableCopy];
    NSLog(@"%@ -- %@",list,array);
    NSLog(@"\n%p\n%p",list,array);
    // 内容一样,内存地址不一样
        
    [array addObject:@"2"];
    NSLog(@"%@ -- %@",list,array);
    NSLog(@"\n%p\n%p",list,array);
    // 修改后,内容不一样,内存地址也不一样
    // 深拷贝
    
    // 第六种情况
    NSMutableArray *list = [NSMutableArray arrayWithObject:@"1"];
    NSArray *array = [list copy];
        
    NSLog(@"%@ -- %@",list,array);
    NSLog(@"\n%p\n%p",list,array);
    // 内容一样,内存地址不一样
        
    [list addObject:@"2"];
        
    NSLog(@"%@ -- %@",list,array);
    NSLog(@"\n%p\n%p",list,array);
    // 修改后,内容不一样,内存地址也不一样
    // 深拷贝
    
    // 第七种情况
    NSMutableArray *list = [NSMutableArray arrayWithObject:@"1"];
    NSMutableArray *array = [list mutableCopy];
        
    NSLog(@"%@ -- %@",list,array);
    NSLog(@"\n%p\n%p",list,array);
    // 内容一样,内存地址不一样
        
    [list addObject:@"2"];
        
    NSLog(@"%@ -- %@",list,array);
    NSLog(@"\n%p\n%p",list,array);
    // 修改后,内容不一样,内存地址也不一样
    // 深拷贝
    

    相关文章

      网友评论

          本文标题:iOS 浅拷贝和深拷贝

          本文链接:https://www.haomeiwen.com/subject/xymltctx.html