Chắc chắn việc đặt 'bản sao' trên một tuyên bố thuộc tính bay lên khi sử dụng môi trường hướng đối tượng nơi các đối tượng trên heap được chuyển qua tham chiếu - một trong những lợi ích bạn nhận được ở đây là, khi thay đổi một đối tượng, tất cả các tham chiếu đến đối tượng đó xem những thay đổi mới nhất Rất nhiều ngôn ngữ cung cấp 'ref' hoặc các từ khóa tương tự để cho phép các loại giá trị (nghĩa là các cấu trúc trên ngăn xếp) được hưởng lợi từ cùng một hành vi. Cá nhân, tôi sử dụng bản sao một cách tiết kiệm và nếu tôi cảm thấy rằng giá trị thuộc tính cần được bảo vệ khỏi các thay đổi được thực hiện cho đối tượng được gán từ đó, tôi có thể gọi phương thức sao chép của đối tượng đó trong khi gán, ví dụ:
p.name = [someName copy];
Tất nhiên, khi thiết kế đối tượng có chứa thuộc tính đó, chỉ bạn mới biết liệu thiết kế có được lợi từ một mẫu mà bài tập lấy bản sao hay không - Cocoawithlove.com có những điều sau đây để nói:
"Bạn nên sử dụng một trình truy cập sao chép khi tham số setter có thể thay đổi nhưng bạn không thể thay đổi trạng thái bên trong của một thuộc tính mà không cần cảnh báo " - vì vậy, phán đoán về việc bạn có thể chịu được giá trị thay đổi bất ngờ hay không là của riêng bạn. Hãy tưởng tượng kịch bản này:
//person object has details of an individual you're assigning to a contact list.
Contact *contact = [[[Contact alloc] init] autorelease];
contact.name = person.name;
//person changes name
[[person name] setString:@"new name"];
//now both person.name and contact.name are in sync.
Trong trường hợp này, không sử dụng bản sao, đối tượng liên hệ của chúng tôi sẽ tự động nhận giá trị mới; tuy nhiên, nếu chúng tôi đã sử dụng nó, chúng tôi sẽ phải đảm bảo rằng các thay đổi được phát hiện và đồng bộ hóa theo cách thủ công. Trong trường hợp này, giữ lại ngữ nghĩa có thể là mong muốn; trong một bản khác, bản sao có thể phù hợp hơn.
name
phát hành trongdealloc
hay không?