Tôi đọc vài chủ đề khác về nó, nhưng tôi vẫn bị mất.Cách triển khai đúng cách mutableCopyWithZone và copyWithZone
Tôi muốn tạo 2 loại đối tượng, một đối tượng không thay đổi chỉ với thuộc tính "chỉ đọc" và một thuộc tính có thể thay đổi chỉ với thuộc tính "ghi đè".
Cho phép gọi chúng là EXCar và EXMutableCar.
EXCar là phân lớp của NSObject và EXMutableCar là phân lớp của EXCar.
ExCar sẽ có trong giao diện của nó
@property (nonatomic, strong, readonly) NSString *name;
EXMutableCar sẽ có trong giao diện của nó
@property (nonatomic, strong) NSString *name;
Vì vậy, tôi "mở" tính chất của EXCar khi tôi sử dụng subclasse nó EXMutableCar. Và sau đó nó có thể thay đổi. Vấn đề là sao chép chính xác giữa chúng.
tôi thực hiện mutableCopyWithZone trong EXCar:
- (id)mutableCopyWithZone:(NSZone *)zone {
EXMutableCar *mutableCopy = [[EXMutableCar allocWithZone:zone] init];
mutableCopy.name = _name;
return mutableCopy;
}
Câu hỏi đầu tiên, nó là cách tốt để làm điều đó? (Tôi muốn nuốt bản sao)
Vấn đề là với copyWithZone. Kể từ khi các thuộc tính của EXCar là readonly tôi không thể tạo không phải trong EXCar, không phải trong EXMutableCar một trường hợp mới của EXCar và điền thuộc tính của nó như thế này:
- (id)copyWithZone:(NSZone *)zone {
EXCar *copy = [[EXCar allocWithZone:zone] init];
copy.name = _name; // This can't work...
return copy;
}
Và tôi không thực sự muốn làm một "init" phương pháp với 15 thuộc tính để vượt qua (chắc chắn, EXCar là một ví dụ, các lớp thực sự có đầy đủ nhiều thuộc tính). Và thông thường chúng được bắt đầu từ thông điệp JSON từ máy chủ, vì vậy chúng không cần phương thức init phức tạp.
Câu hỏi thứ hai là như vậy, cách thực hiện copyWithZone khiến lớp học của tôi không thay đổi được?
Nhờ sự giúp đỡ của bạn :)
Sao chép trên lớp con có thể thay đổi phải trả lại phiên bản bất biến, ví dụ EXCar, không phải EXMutableCar. Điều này đặc biệt quan trọng nếu các lớp thực hiện bình đẳng tùy chỉnh khi hàm băm có thể phụ thuộc vào một số giá trị có thể thay đổi (trong phân lớp có thể thay đổi), đó là lý do tại sao, ví dụ, NSDictionary sao chép khóa của nó, nó mong đợi các đối tượng bất biến trở lại với băm không thay đổi. –