2018.08.27 19:54*?字數(shù) 533?閱讀 979評論 2喜歡 0
copyWithZone
copyWithZone是NSCopying協(xié)議的方法输枯,只有實現(xiàn)了copyWithZone方法的對象才能夠進行copy的操作花颗。像NSArray棺亭、NSMutableArray凝危,NSDictionary、NSMutableDictionary等內(nèi)部都實現(xiàn)了copyWithZone方法才能進行copy操作势篡。
NSObject類有copyWithZone和MutableCopyWithZone兩個類方法饶辙,但是其本身并沒有實現(xiàn),它要求子類去實現(xiàn)迂苛,子類要調(diào)用copy方法進行復制三热,必須遵循NSCopying協(xié)議實現(xiàn)copyWithZone方法,否則會崩潰三幻。
copy有淺拷貝和深拷貝就漾,具體想要實現(xiàn)哪一種,可以在copyWithZone和MutableCopyWithZone方法里面自定義實現(xiàn)念搬。copy和mutableCopy操作分別對應copyWithZone和MutableCopyWithZone方法抑堡。
對于不可變對象,淺拷貝為指針拷貝朗徊,深拷貝為復制不可變副本
對于可變對象首妖,淺拷貝為不可變副本,深拷貝為可變副本
如果我們想用我們的某個類需要區(qū)別對待這兩個功能——同時提供創(chuàng)建可變副本和不可變副本的話爷恳,一般在NSCopying協(xié)議規(guī)定的方法 copyWithZone中返回不可變副本有缆;而在NSMutableCopying的mutableCopyWithZone方法中返回可變副本。然后調(diào) 用對象的copy和mutableCopy方法來得到副本温亲。
很少自定義可變類型的類妒貌,所以我們可以copyWithZone實現(xiàn)指針拷貝或副本拷貝,這完全取決于作者意愿以及業(yè)務需求
例如我想將copyWithZone方法用于淺拷貝铸豁,即指針拷貝
有一個Product類
@interface Product :NSObject<NSCopying>
@property (strong, nonatomic) NSString* name;
@end
//淺拷貝
@implementation Product
- (id)copyWithZone:(NSZone *)zone {
? ? return self;
}
@end
或者想將copyWithZone方法用于深拷貝灌曙,即副本拷貝
//深拷貝
@implementation Product
- (id)copyWithZone:(NSZone *)zone {
? ? Product *copy = [[Product allocWithZone] init];
????copy.name = self.name; ? //屬性賦值,多個屬性時同理
????return copy; ?//返回副本
}
注意的一點节芥,當Product有子類時在刺,需要這樣寫Product *copy = [[[self class] allocWithZone] init];
因為copyWithZone會被繼承,當子類使用copy方法時头镊,最終會調(diào)用到父類的copyWithZone方法
}
allocWithZone