說明 深複製和淺複製
指標只是儲存在記憶體中資源位址的佔位符。在複製操作中,如果只是將指標複製給新物件(副本),那麼底層的資源實際上仍然由兩個例項在共享。其實兩者指向的都是同一塊記憶體。這就是淺複製。
什麼是深複製呢?深複製是指不僅複製指標值,還複製指標所指向的資源。
cocoa touch框架為nsobject的派生類提供了實現深複製的協議。nsobject的子類需要實現nscopying協議以及其方法:
-(id)copywithzone:(nszone *)zone;
nsobject有乙個實列方法叫做-(id)copy
。預設的copy方法呼叫[self copywithzone:nil]
;對於採納了nscopying協議的子類,需要實現這個方法,否則會引發異常。
prototype.h
//
// prototype.h
// test
//// created by zhanggui on 15/8/5.
//#import @inte***ce prototype : nsobject@property(nonatomic)nsstring *name;
@end
prototype.m
//
// prototype.m
// test
//// created by zhanggui on 15/8/5.
//#import "prototype.h"
@implementation prototype
//實現nscopying中的方法
-(id)copywithzone:(nszone *)zone
@end
然後在viewcontroller中呼叫。具體的viewdidload**如下:
- (void)viewdidload
執行結果如下:
2015-08-05 20:51:20.535 test[8763:3496263] prototyp addreess:0x7a3e35a0
2015-08-05 20:51:20.536 test[8763:3496263] deepaddress:0x7a3e4650
2015-08-05 20:51:20.536 test[8763:3496263] shallowaddress:0x7a3e35a0
2015-08-05 20:51:20.536 test[8763:3496263] prototype:originname
2015-08-05 20:51:20.536 test[8763:3496263] deep:(null)
2015-08-05 20:51:20.536 test[8763:3496263] shallow:originname
2015-08-05 20:51:20.536 test[8763:3496263] changed.........
2015-08-05 20:51:20.536 test[8763:3496263] prototype:newname
2015-08-05 20:51:20.536 test[8763:3496263] deep:(null)
2015-08-05 20:51:20.536 test[8763:3496263] shallow:newname
結論: iOS設計模式 原型模式
使用原型例項指定建立物件的種類,並通過複製這個原型建立新的物件 它通過複製乙個已經存在的例項來返回新的例項,而不是新建例項 原型模式實際意義上來說是拷貝 而且一般情況下都是深拷貝。簡單理解就是 建立第乙個模板物件,然後通過複製模板來建立新的物件 遵守協議 實現 id copywithzone nsz...
設計模式之原型模式
原型模式其實就是從乙個物件再建立乙個可定製的物件,而且不需要知道建立的細節。具體就是說通過複製或者轉殖乙個原型物件產生新的物件 轉殖物件 分為兩種 深複製或者淺複製,這兩種的主要區別是 在原型中如果有物件的引用,淺複製是將引用複製過來了,也就是淺複製和原型中的物件的引用相同,而深複製是將轉殖物件中引...
設計模式之原型模式
include include 此練習為原型模式方法的練習 原型模式揭示了在同一原型上可以通過複製使得 只需要例項化一次,再通過相應的類函式操作可以得到 同一原型下的不同的版本物件 此練習將考慮在實際開發中 比如 工作經歷也是作為乙個類被含在簡歷類中的情況 這情況將涉及到類的引用和深 淺複製 原型基...