Copy

作者: 曹来东 | 来源:发表于2018-09-17 16:58 被阅读12次

拷贝

产生一个副本对象,和原对象互不影响,修改了任意对象,不会影响另一个对象.

copy和mutableCopy

  • copy:不可变拷贝,产生不可变副本.
  • mutableCopy : 可变拷贝,产生可变副本.

深拷贝 浅拷贝

  • 深拷贝:内容拷贝,产生新对象
  • 浅拷贝:指针拷贝,不会产生新对象.
    image.png
//NSString
    NSString * str1 = [NSString stringWithFormat:@"test"];
    NSString * str2 = [str1 copy];//返回NSString
    NSString * str3 = [str1 mutableCopy];//返回NSMutableString
    NSLog(@"%@ %@ %@",str1,str2,str3);

//NSMutableString
    NSMutableString * str1 = [NSMutableString stringWithFormat:@"test"];
    NSString * str2 =  [str1 copy];//copy 就是返回不可变对象
    NSMutableString * str3 = [str1 mutableCopy];//mutableCopy 就是返回可变对象
    NSLog(@"%@ %@ %@",str1,str2,str3);

字符串的引用计数为-1,说明采用了Tagger Pointer.只需要将字符串写一些即可

OC对象的copy操作

  • 使用copy时,不要修饰可变对象.
    @property (nonatomic,copy) NSMutableArray * data;
@interface ViewController ()
//copy返回的是一个不可变对象,不可变对象没有addObject方法
@property (nonatomic,copy) NSMutableArray * data;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
 
    self.data = [NSMutableArray array];
    [self.data addObject:@"1"];
    [self.data addObject:@"1"];
}
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArray0 addObject:]: unrecognized selector sent to instance 0x60c0000080a0'

自定义Copy

@interface LDPerson : NSObject <NSCopying>
@property (assign, nonatomic) int age;
@property (assign, nonatomic) double weight;
@end
#import "LDPerson.h"

@implementation LDPerson

- (id)copyWithZone:(NSZone *)zone
{
    LDPerson *person = [[LDPerson allocWithZone:zone] init];
    person.age = self.age;
//    person.weight = self.weight;
    return person;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"age = %d, weight = %f", self.age, self.weight];
}

@end
//调用
- (void)viewDidLoad {
    [super viewDidLoad];
    LDPerson *p1 = [[LDPerson alloc] init];
    p1.age = 20;
    p1.weight = 50;
    
    LDPerson *p2 = [p1 copy];
    p2.age = 30;
    
    NSLog(@"%@", p1);
    NSLog(@"%@", p2);
    }

相关文章

  • Copy Copy Copy

    说到Copy 大多会想到浅复制(指针复制),深复制(内容复制)。看一张图: 你会发现对于集合类型,深复制那写的是...

  • 2018-09-27

    copy的问题 copy.copy返回浅copy copy.deepcopy返回深copy 1fromcopyim...

  • 关于深copy和浅copy

    深copy 所谓深copy是指内容copy 浅copy 所谓浅copy是指指针copy 集合的单层深copy 在多...

  • golang 值和指针

    地址copy,引用copy 值copy

  • Python的直接赋值,深拷贝和浅拷贝以及使用场景

    概述 深浅拷贝用法来自copy模块导入模块: import copy浅拷贝: copy.copy深拷贝: copy...

  • day 9

    浅拷贝和深拷贝 copy.copy(对象):浅拷贝 copy.deepcopy(对象):深拷贝 copy.copy...

  • day-9-函数基础

    import copy"""copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" a...

  • 深浅拷贝判断地址是否相同

    导入 import copy 模块 浅拷贝:copy.copy() 深拷贝:copy.deepcopy() 代码:...

  • 内存管理

    ARC MRC 属性 循环引用 深浅copy一 ,先说深浅copy概念很简单 浅copy 就是copy...

  • Python浅拷贝与深拷贝

    Python浅拷贝与深拷贝 讨论import copy中copy.copy与copy.deepcopy区别。 根据...

网友评论

      本文标题:Copy

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