猫猫整理问题之:copy,对象自定义copy
2015-04-10 20:24
99 查看
猫猫分享,必须精品
原文地址:http://blog.csdn.net/u013357243?viewmode=contents
Copy(不可变)和MutableCopy(可变)针对Foundation框架的数据类型。
对于自定义类,copy就是可变的。
由结果我们得到一下结论
1:arrayM,aM,a是三个不同的对象
2:可变 => 可变 (arrayM是可变的,用mutableCopy给aM 得出aM.class是NSArrayM )
3:可变 => 不可变(aM是可变的,用copy给a 得出a.class是NSArrayI)
由上结果我们得到结论
1:不可变 => 可变 内存地址变了,class由NSArrayI=>NSArrayM
2:不可变 => 不可变 内存地址一致,class由NSArrayI=>NSArrayI
作用是指针的复制,引用计数+1。术语(浅复制)
NSString
Block
在@property中使用什么杨的类型说明他,他就有什么样的方法。
例如这段代码:
如果用strong来说明person的name,当我们修改strM的时候,p.name也会跟着改,如果用的时copy的话,那么他就不会被修改。这里取决于Person类中的@property
简单理解,如果用了copy就是复制一个String给name
而如果用了strong,就仅仅是引用计数+1。
p.name能不能修改呢?这里我们不能直接修改,我们需要用一个万能指针。
这要用strong能改,这样类会变得不安全。我们把strong改成copy
当我们修改“源”的时候
p.name还是原样的。
而这时候修改属性的方法编译没有问题,但是运行时候会报错
Attempt to mutate immutable object with xxx
视图修改一个不可变的类型,使用方法xxx
对于”可变类型”的属性,不要使用copy描述符定义,否则赋值后,就是不可变了!
(自定义对象要实现copy功能)
1> 遵守NSCopying协议(本质上就是方便程序员编写代码时候,有快捷提示)
2> 实现- (id)copyWithZone:(NSZone *)zone
(zone,区域,很少用)
所有的copy方法,最终都会调用copyWithZone方法
copy操作一个对象,复制给一个新的对象。
这时候我们这样调用
这时候我们就能调用自己定义的类对象的copy方法了,并且可以产生一个对象。
注意:这里的p1.name = @”lisi”并不是修改,而是重新赋值。不要让copy给弄迷糊了。
ps:新建iOS交流学习群:304570962
可以加猫猫QQ:1764541256 或则微信znycat
让我们一起努力学习吧。
原文:http://blog.csdn.net/u013357243?viewmode=contents
原文地址:http://blog.csdn.net/u013357243?viewmode=contents
copy
copy的正目的
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)
不可变数组的copy
void copyDemo2() { NSArray *array = @[@(1), @(2)]; NSLog(@"%@ %p %@", array, array, array.class); // 1. 不可变 => 可变 NSMutableArray *aM = [array mutableCopy]; NSLog(@"%@ %p %@", aM, aM, aM.class); // 2. 不可变 => 不可变(浅复制) // 指针的复制,引用计数+1 NSArray *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.name id 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自定义对象
[object 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; }
这时候我们这样调用
void copyDemo5() { Person *p = [[Person alloc] init]; p.name = @"zhangsan"; p.age = 18; NSLog(@"%@", p); Person *p1 = [p copy]; p1.name = @"lisi"; NSLog(@"%@", p1); }
这时候我们就能调用自己定义的类对象的copy方法了,并且可以产生一个对象。
注意:这里的p1.name = @”lisi”并不是修改,而是重新赋值。不要让copy给弄迷糊了。
ps:新建iOS交流学习群:304570962
可以加猫猫QQ:1764541256 或则微信znycat
让我们一起努力学习吧。
原文:http://blog.csdn.net/u013357243?viewmode=contents
相关文章推荐
- 猫猫整理问题之:copy,对象自定义copy 什么是property
- AJ整理问题之:copy,对象自定义copy 什么是property
- AjaxPro框架使用整理(二) 客户端与服务器端自定义对象交互
- ASP.Net中用ViewState存储自定义复杂对象后类型转换的一个问题
- jquery事件处理函数的参数问题:event对象和自定义参数
- 猫猫整理问题之:内存堆栈
- 关于WebService传递自定义对象的问题
- Python 关于拷贝(copy)汇总(列表拷贝 // 字典拷贝 // 自定义对象拷贝)
- 自定义对象作为NSDictionary key的一些问题
- 自定义adapter的基础上Listview优化方案以及几个小错误(checkbox吃掉点击事件以及对象重复问题)
- 关于WebService传递自定义对象的问题
- python 字典对象赋值之deepcopy遭遇的问题及解决过程(lxml惹的祸)
- python 字典对象赋值之deepcopy遭遇的问题及解决过程(lxml惹的祸)
- Objective-C Copy语法(二)对于我们自定义对象Copy以及[self class]相关的错误
- winform 关于Messagebox自动定时关闭和自定义提示框总按钮上文本的问题的整理
- .net面试基本问题一 ASP.Net七大内置对象 (网络整理)
- AJAX JSON中日期类型DateTime格式化的序列化自定义对象以及自定义类型参数的问题处理
- hibernate3使用c3p0连接池调用oracle自定义对象问题处理
- 猫猫整理问题之:NSTimer准确吗?
- String.CopyTo方法和java多线程的一些问题整理