猫猫整理问题之:copy,对象自定义copy

猫猫分享,必须精品 原文地址:?viewmode=contents

copycopy的正目的

copy 目的:建立一个副本,彼此修改,各不干扰 Copy(不可变)和MutableCopy(可变)针对Foundation框架的数据类型。 对于自定义类,copy就是可变的。

可变数组的copy

这里用NSMutableArray为例子。

// 可变=》可变&不可变,内存地址都会变化void copyDemo1(){NSMutableArray *arrayM = [NSMutableArray arrayWithObjects:@(1), @(2), nil];NSLog(@”%@ %p %@”, arrayM, arrayM, arrayM.class);// 1. 可变 => 可变NSMutableArray *aM = [arrayM mutableCopy];NSLog(@”%@ %p %@”, aM, aM, aM.class);// 2. 可变 => 不可变NSArray *a = [arrayM copy];NSLog(@”%@ %p %@”, a, a, a.class);}

由结果我们得到一下结论 1:arrayM,aM,a是三个不同的对象 2:可变 => 可变 (arrayM是可变的,用mutableCopy给aM 得出aM.class是NSArrayM ) 3:可变 => 不可变(aM是可变的,用copy给a 得出a.class是NSArrayI)

不可变数组的copyvoid copyDemo2(){NSArray *array = @[@(1), @(2)];NSLog(@”%@ %p %@”, array, array, array.class);// 1. 不可变 => 可变NSMutableArray *aM = [array mutableCopy];NSLog(@”%@ %p %@”, aM, aM, aM.class);// 2. 不可变 => 不可变(浅复制)// 指针的复制,引用计数+1NSArray *a = [array copy];NSLog(@”%@ %p %@”, a, a, a.class);}

由上结果我们得到结论 1:不可变 => 可变 内存地址变了,class由NSArrayI=>NSArrayM 2:不可变 => 不可变 内存地址一致,class由NSArrayI=>NSArrayI 作用是指针的复制,引用计数+1。术语(浅复制)

3:浅复制:不可变=>不可变 深复制:其他三种情况! (在这里记忆时候记住都不能改就是浅复制,能改就是深复制,相对于记忆四中情况更容易记忆。)哪里用的最多呢?

这里用的最多

@property (nonatomic, copy) NSString *name;

NSString Block

都使用copy属性,copy属性,在赋值时,会默认做一次copy操作,让他变成“不可变的类型”strong相当于MRC中的retain,在赋值时,只是引用计数+1

在@property中使用什么杨的类型说明他,他就有什么样的方法。 例如这段代码:

NSMutableString *strM = [NSMutableString stringWithString:@”zhangsan”];NSLog(@”%@ %p %@”, strM, strM, strM.class);Person *p = [[Person alloc] init];p.name = strM;NSLog(@”%@ %p %@”, p.name, p.name, p.name.class);// 修改”源”,p.name会跟着修改[strM setString:@”lisi”];NSLog(@”==== %@ %p”, strM, strM);NSLog(@”%@ %p”, p.name, p.name);

如果用strong来说明person的name,当我们修改strM的时候,p.name也会跟着改,如果用的时copy的话,那么他就不会被修改。这里取决于Person类中的@property 简单理解,,如果用了copy就是复制一个String给name 而如果用了strong,就仅仅是引用计数+1。 p.name能不能修改呢?这里我们不能直接修改,我们需要用一个万能指针。

// 修改p.nameid obj = p.name;[obj setString:@”wangwu”];NSLog(@”==== %@ %p”, strM, strM);NSLog(@”%@ %p”, p.name, p.name);

这要用strong能改,这样类会变得不安全。我们把strong改成copy 当我们修改“源”的时候

[strM setString:@”lisi”];

p.name还是原样的。 而这时候修改属性的方法编译没有问题,但是运行时候会报错

Attempt to mutate immutable object with xxx 视图修改一个不可变的类型,使用方法xxx

对于”可变类型”的属性,不要使用copy描述符定义,否则赋值后,就是不可变了!

copy自定义对象[p copy]

想要让对象能用copy方法 [p copy] (自定义对象要实现copy功能) 1> 遵守NSCopying协议(本质上就是方便程序员编写代码时候,有快捷提示) 2> 实现- (id)copyWithZone:(NSZone *)zone (zone,区域,很少用) 所有的copy方法,最终都会调用copyWithZone方法 copy操作一个对象,复制给一个新的对象。

– (id)copyWithZone:(NSZone *)zone{// 1> 实例化对象,self 是对象// self.class能够保证继承的子类同样使用copy方法Person *p = [[self.class alloc] init];// 2> 给属性赋值p.name = self.name;p.age = self.age;// 3> 返回新对象return p;}快忘了那些不高兴的事吧!你看就连今天的阳光都如此明媚灿烂,

猫猫整理问题之:copy,对象自定义copy

相关文章:

你感兴趣的文章:

标签云: