一個對象使用copy或mutableCopy方法能夠建立對象的副本spa
copy – 須要先實現NSCoppying協議,建立的是不可變副本(如NSString、NSArray、NSDictionary)指針
mutableCopy – 須要先實現NSMutableCopying協議,建立的是可變副本(如NSMutableString、NSMutableArray、NSMutableDictionary)對象
深複製:內容拷貝,源對象和副本指向的是不一樣的兩個對象。源對象引用計數器不變,副本計數器設置爲1it
淺複製:指針拷貝,源對象和副本指向的是同一個對象。對象的引用計數器+1,其實至關於作了一次retain操做io
只有不可變對象建立不可變副本(copy)纔是淺複製,其餘都是深複製table
若是想自定義copy,那麼就必須遵照NSCopying,而且實現 copyWithZone:方法class
若是想自定義mutableCopy,那麼就必須遵照NSMutableCopying,而且實現 mutableCopyWithZone: 方法引用
以copy爲例,建議用[self class]代替直接類名方法
- (id)copyWithZone:(NSZone *)zone {im
id copy = [[[self class] allocWithZone:zone] init];
// 作一些屬性的初始化.....
return copy;
}