-(id)copyWithZone:(NSZone *)zone{ return nil; } NSZone:以前開發程序時,會把內存分為不同的區,對象會創建在某個區里。現在不用,每個程序都會有一個默認區,這個參數不用管。。。 copy方法由NSObject實現,當我們想要覆寫copy方法是,實際需要實現的是copyWithZone方法。 -(id)mutableCopyWithZone:(NSZone *)zone{ return nil; } -(id)mutableCopy{ return nil; } mutableCopy這個輔助方法與copy類似,也是用默認參數zone來調用mutableCopyWithZone。 在可變類中覆寫copyWithZone時,不要返回可變的拷貝對象,應該返回一個不可變的版本。 對于NSArray和NSMutableArray來說,下面的關系總是成立的 [NSMutableArray copy] => NSArray [NSArray mutableCopy] => NSMutableArray 注意:在可變對象上調用copy方法會返回一個不可變實例。這樣做是為了能在可變版本與不可變版本之間自由切換。 Foundation 框架中所有集合類在默認情況下都執行淺拷貝,只拷貝容器對象本身,不復制其中數據。主要原因是,容器內的對象未必都能拷貝,而調用者也未必想在拷貝容器的時候一并拷貝其中的每個對象。 因為沒有深拷貝的協議方法,其具體的實現方法由每個類來確定。在絕大多數情況下都是淺拷貝,深拷貝的方法只能自己來編寫。 總結: 1.自定義對象想具備拷貝功能,需要實現NSCopying協議 2.自定義對象想分為可變與不可變兩個版本,需要同時實現NSCopying和NSMutableCopying協議 3.復制對象時需要決定執行深拷貝還是淺拷貝,一般情況下盡量執行淺拷貝 4.如果對象需要執行深拷貝,可以考慮新增加一個執行深拷貝的方法
新聞熱點
疑難解答