iOS常用设计模式——原型模式
1. 什么是原型模式? (what)
原型模式属于创建性设计模式,它通过拷贝的方式快速创建一个对象,这里拷贝的方式有两种:1.)浅拷贝(指针拷贝); 2.)深拷贝(值拷贝);采用原型模式创建一个新的对象效率更高。
什么是深拷贝和浅拷贝? (What)
深拷贝也叫做值拷贝,新创建的对象会在内存中开辟新的空间,而把被拷贝对象的值拷贝过来;浅拷贝也叫做指针拷贝,新创建的对象的指针与原对象的指针指向相同的内存空间,并有相同的值,浅拷贝的对象就如同原对象的影子
NSString*str = @”AAA”;
NSString*strCopy = [str copy];
NSMutableString*strMCopy = [str mutableCopy];
NSLog(@”str对象:%@, 地址:%p”, str, str);
NSLog(@”strCopy对象:%@,地址: %p”, strCopy,strCopy);
NSLog(@”strMcopy对象:%@, 地址:%p”, strMcopy, strMCopy);
2014-10-07 09:28:18.578 Prototype_Demo[516:303] str对象:AAA, 地址:0x100001058
2014-10-07 09:28:18.579 Prototype_Demo[516:303] strCopy对象:AAA, 地址:0x100001058
2014-10-07 09:28:18.580 Prototype_Demo[516:303] strMCopy对象:AAA, 地址:0x10010af70
2. 什么场景下使用原型模式? (Where)
1. 对象类型需要在运行时才能确定
2. 需要某对象在某状态下的副本
3. 对象间的差别很小,使用原型系统复制一个对象后再进行必要的修改
3. 如何实现原型模式? (How)
1.) 定义一个Person类,其中包含三个属性变量:
@interface Person : NSObject <NSCopying, NSMutableCopying>
@property (nonatomic, copy)NSMutableString *name;
@property (nonatomic, copy) NSString*sex;
@property (nonatomic, assign) int age;
- (id)initWithName:(NSMutableString *)aName withSex:(NSString *) aSex withAge:(int) aAge;
2.)在实现文件中实现初始化和协议中必须实现的方法
- (id)initWithName:(NSMutableString *)aName withSex:(NSString *) aSex withAge:(int) aAge{
if (self = [super init]) {
self.name = aName;
self.sex = aSex;
self.age = aAge;
}
return self;
}
//这里需要注意,当对象调用copy方法时,将得到不可变对象,不管该对象之前是可变还是不可变的。而调用mutableCopy则会得到可变对象,不管该对象之前是可变还是不可变。
- (id)copyWithZone:(NSZone *)zone
{
Person *obj = [[self class] allocWithZone:zone];
obj.name = [self.name mutableCopy];
obj.sex = [self.sex copy];
obj.age = self.age;
return obj;
}
- (id)mutableCopyWithZone:(NSZone*)zone{
Person *obj = [[self class] allocWithZone:zone];
obj.name = [self.name mutableCopy];
obj.sex = [self.sex copy];
obj.age = self.age;
return obj;
}
3.) 在main函数中使用copy和mutableCopy方法创建新的对象
NSMutableString *name = [NSMutableString stringWithFormat:@"AAA"];
Person *person = [[Person alloc] initWithName:name withSex:@"Boy" withAge:20];
Person *aPerson = [person copy];
NSLog(@"%@", aPerson.name);
Person *bPerson = [person mutableCopy];
NSLog(@"%@", bPerson.sex);
demo下载地址:http://download.csdn.net/detail/luozhonglan/8008379
*****************************************************************************************************************************************************************************************
presented by 罗大柚子
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。