對象複製分為淺拷貝和深拷貝,理解兩者區別至關重要。
NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"a", @"b", nil];
NSMutableArray *array2 = array1; // 僅複製指針
[array2 addObject:@"c"];
// 遍歷 array1 輸出:a, b, c
// 原因:array1 和 array2 指向同一塊內存區域
淺拷貝只是複製指針,雙方指向同一對象,修改其中一個會影響另一個。
若需修改副本不影響原對象,必須使用深拷貝。分為:
copy 方法,產生不可變對象(如 NSArray、NSString)。mutableCopy 方法,產生可變對象(如 NSMutableArray、NSMutableString)。直接調用 copy / mutableCopy 即可。
需遵循 NSCopying 協議,實現兩個方法:
// 不可變拷貝
- (id)copyWithZone:(NSZone *)zone {
MyClass *new = [[MyClass allocWithZone:zone] init];
new.string = self.string; // 根據屬性屬性決定是 assign/retain/copy
return new;
}
// 可變拷貝
- (id)mutableCopyWithZone:(NSZone *)zone {
MyClass *new = [[MyClass allocWithZone:zone] init];
new.string = self.string;
return new;
}
深拷貝會重新分配內存空間,用原對象的值進行初始化,而非共享同一塊內存。這樣修改副本不會影響原對象。