定义
原型模式与其他创建类型模式应用场景很类似。
- 不关心具体实现的类名,只关心抽象类
- 只有一个接口实现创建实例
- 唯一不同点就是不再是新建具体实例,而是克隆拷贝。
作用
对于iOS开发来说,我不知道此模式具体的应用,但是在使用此模式时有一难点让我又回顾一遍深浅拷贝。
深浅拷贝区别
区别在于其实例变量的拷贝。
深:分开管理内存
浅:共享内存
实现
iOS开发中,NSObject 类就声明了copy 对象的方法,但是所有调用此方法的对象必须遵循NSCopying,实现copyWithZone:
。而深浅拷贝就在方法里做实现:
-(id)copyWithZone:(NSZone *)zone
{
#if 0 //Deep Copy
concretePrototype *copy = [[[self class]allocWithZone:zone]init];
#else //Shallow Copy
concretePrototype *copy = [[self class]allocWithZone:zone];
copy.name = self.name; //实例变量增加引用计数,共享内存
#endif
return copy;
}
NSCopying Vs NSMutableCopying
如果对象存在可变与不可变区别,以实例变量为例。
- 不可变的实例变量调用copy时只是做引用计数加1操作,共享内存而已。但是可变的实例变量调用copy时需要重新创建实例,引用计数仍为1。
- 不可变实例调用mutabelCopy时重新创建一个可变实例。可变实例变量也是如此。
- 所遵循的协议分别是
copyWithZone:
与mutableCopyWithZone:
@property assign Vs weak Vs strong Vs copy
这里的copy关系到对象的生命周期
assign Vs weak
都是弱引用,就iOS6系统版本以上而言(具体是低过6.0)。在ARC下,当对象释放时,assign指针成为野指针,一种不安全的方式(相当于unsafe_unretained),而weak指针会自动设为nil,是安全的行为。所以一般delegate声明应该使用weak,但是UITableView的delegate使用assign,是为了UIKit兼容之前的很久久的系统版本。
unsafe_unretained:There are a few classes in Cocoa and Cocoa Touch that don’t yet support weak references, which means you can’t declare a weak property or weak local variable to keep track of them. These classes include NSTextView, NSFont and NSColorSpace; for the full list, see Transitioning to ARC Release Notes.
strong Vs copy
ARC下,strong即retain,所以意为持有对象,相应引用计数增加1;copy对于不可变对象也是retain功能,引用计数增加1,但是对于可变对象,copy则是持有新对象的意思,引用计数为1。
总结
据书中介绍原型模型对于C++比较重要,相反OC就不一样了,有了解或实践过的人希望告知。回顾iOS的copy方法,再参照原型模型图自然很好写出一个demo :]