征服objective—c 的NScopy,NSMutablecopy
2015-11-02 19:00
375 查看
oc中的copy并不难,只要细心的理解每个碎知识点就一定能掌握,下面我就带着大家一起来征服它!
拷贝分为深拷贝和浅拷贝
浅拷贝:不产生新的对象,直接指向原有对象
深拷贝:产生新的对象,其内容是原有对象的内容
拷贝:NSCopy、NSMutableCopy
NSCopy拷贝出的结果是不可变对象,跟其接受类型没有关系,跟其传入类型也没有关系,NSMutablecopy拷贝的结果是可变对象,跟其传入的类型没有关系,但是会受其接收类型的影响,当使用NSCopy复制一个不可变对象时,其行为是浅复制,其余情况都是深拷贝。
当使用NSMutablecopy时,是深拷贝(前提是copy系统自带nsstring,naarry。。。等
话不多说还是上代码比较简洁明了:
建一个person类;
main函数:
#import<Foundation/Foundation.h>
#import
"Person.h"
intmain(intargc,constchar
* argv[]) {
@autoreleasepool{
Person *p = [[Personalloc]init];
NSMutableString*s = [NSMutableStringstringWithFormat:@"胡汉三"];
p.name= s;
NSLog(@"%@",p);
//打印结果 :胡汉三
Person*p1 =
[p
mutableCopy];
//深拷贝,p1的地址和p不一样,可以打印地址看一下
[s
setString:@"王五"];
p1.name= s;
NSLog(@"%@,%@",p,p1);
//打印结果 p = 胡汉三 ,p1 = 王五
}
return0;
}
---------------------------------------------------------------------------------------
person.h文件
#import<Foundation/Foundation.h>
@interfacePerson :NSObject<NSCopying,NSMutableCopying>
@property(nonatomic,copy)NSString*name;
//定义一个name属性,此时括号里应该用copy 而不是strong。
@end
--------------------------------------------------------------------------------------
person.m 文件
#import"Person.h"
@implementationPerson
-(NSString*)description{
return_name;
}
//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝
-(id)copyWithZone:(NSZone*)zone{
Person *p = [PersonallocWithZone:zone];
returnp;
}
//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝
-(id)mutableCopyWithZone:(NSZone*)zone{
Person *p = [PersonallocWithZone:zone];
returnp;
}
拷贝分为深拷贝和浅拷贝
浅拷贝:不产生新的对象,直接指向原有对象
深拷贝:产生新的对象,其内容是原有对象的内容
拷贝:NSCopy、NSMutableCopy
NSCopy拷贝出的结果是不可变对象,跟其接受类型没有关系,跟其传入类型也没有关系,NSMutablecopy拷贝的结果是可变对象,跟其传入的类型没有关系,但是会受其接收类型的影响,当使用NSCopy复制一个不可变对象时,其行为是浅复制,其余情况都是深拷贝。
当使用NSMutablecopy时,是深拷贝(前提是copy系统自带nsstring,naarry。。。等
话不多说还是上代码比较简洁明了:
建一个person类;
main函数:
#import<Foundation/Foundation.h>
#import
"Person.h"
intmain(intargc,constchar
* argv[]) {
@autoreleasepool{
Person *p = [[Personalloc]init];
NSMutableString*s = [NSMutableStringstringWithFormat:@"胡汉三"];
p.name= s;
NSLog(@"%@",p);
//打印结果 :胡汉三
Person*p1 =
[p
mutableCopy];
//深拷贝,p1的地址和p不一样,可以打印地址看一下
[s
setString:@"王五"];
p1.name= s;
NSLog(@"%@,%@",p,p1);
//打印结果 p = 胡汉三 ,p1 = 王五
}
return0;
}
---------------------------------------------------------------------------------------
person.h文件
#import<Foundation/Foundation.h>
@interfacePerson :NSObject<NSCopying,NSMutableCopying>
@property(nonatomic,copy)NSString*name;
//定义一个name属性,此时括号里应该用copy 而不是strong。
@end
--------------------------------------------------------------------------------------
person.m 文件
#import"Person.h"
@implementationPerson
-(NSString*)description{
return_name;
}
//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝
-(id)copyWithZone:(NSZone*)zone{
Person *p = [PersonallocWithZone:zone];
returnp;
}
//如果直接return self,则是浅拷贝,如果使用alloc,则是深拷贝
-(id)mutableCopyWithZone:(NSZone*)zone{
Person *p = [PersonallocWithZone:zone];
returnp;
}
相关文章推荐
- NSObject-拷贝 NSCopy-NSMutablecopy
- ObjectiveC1基础代码——类和对象
- 将protobuffer文件转换为objective-c
- objective-c中的数字对象
- DeepID-Net:multi-stage and deformable deep CNNs for object detection
- IOS开发基础Object-C(06)—@property 和@synthesize语法
- UiObject官方文档,个人翻译
- Objective-C的反射
- Objective-OC中的Category(分类)
- Binarized Normed Gradients for Objectness Estimation at 300fps阅读笔记
- FMDB使用
- object-c编程tips-jastor自动解析
- Object-C NSSet类型
- JS入门之ActiveXObject对象
- Objective-C 入门博客链接
- Object-C系列-<present and dismiss>
- IOS开发基础Object-C(05)—OC变量的作用域、self
- Object-C系列-<深入CoreData与问题整理>
- qobject_cast用法
- org.hibernate.TransientObjectException: The given object has a null identifier: