2011-06-22 32 views
7

Vì vậy, chỉ là một câu hỏi đơn giản, khi nào tôi nên sử dụng bản sao thay vì sử dụng giữ lại. Tôi đã cố gắng để nhìn từ internet nhưng không hoàn toàn nhận được nó. Vì vậy, ai đó có thể làm sáng tôi?Bản sao C và giữ lại mục tiêu

+0

bản sao có thể có của [Thuộc tính NSString: sao chép hoặc giữ lại?] (Http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain) hoặc [Mục tiêu C Gán bản sao giữ lại] (http://stackoverflow.com/questions/4510913/) hoặc [Giữ lại bản sao của các đối tượng tự động phát hành] (http://stackoverflow.com/questions/6416963/) hoặc [Khi nào sử dụng giữ lại và khi nào sử dụng bản sao] (http: // stackoverflow .com/questions/4087208 /) hoặc [@property: Giữ lại hoặc sao chép?] (http://stackoverflow.com/questions/5616170/) hoặc [nhiều người khác] (http://stackoverflow.com/search?q= % 5Bobjc% 5D + bản sao + giữ lại) –

+0

Trong câu hỏi bảo vệ, những người khác là tất cả cụ thể cho các loại tài sản, nhưng có, câu hỏi này đã được hỏi rất nhiều. –

Trả lời

27

Bạn sẽ sử dụng copy khi bạn muốn đảm bảo trạng thái của đối tượng.

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString retain]; 
[mutString appendString:@"Test"]; 

Tại thời điểm này b chỉ bị sai lầm bởi dòng thứ ba ở đó.

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString copy]; 
[mutString appendString:@"Test"]; 

Trong trường hợp này b là chuỗi ban đầu và không bị sửa đổi bởi dòng thứ 3.

Điều này áp dụng cho tất cả các loại có thể thay đổi.

+4

Điều đáng chú ý là nhiều loại bất biến sẽ thực hiện bản sao bằng cách gọi -chính; Vì giá trị của chúng sẽ không bao giờ thay đổi, không có điểm nào trong việc có hai bản sao trong bộ nhớ. Điều đó nói rằng, thông tin không rõ ràng hơn, bạn nên luôn luôn mã như thể bạn không biết liệu một đối tượng cụ thể có thể thay đổi hay không. Chỉ vì bạn gõ thuộc tính của bạn là NSString không có nghĩa là ai đó sẽ không vượt qua NSMutableString cho nó (như minh họa ở trên.) – ipmcc

3

Sao chép hữu ích khi bạn không muốn giá trị bạn nhận được thay đổi mà bạn không biết. Ví dụ: nếu bạn có thuộc tính là NSString và bạn dựa vào chuỗi đó không thay đổi sau khi được đặt thì bạn cần sử dụng bản sao. Nếu không, ai đó có thể chuyển cho bạn NSMutableString và thay đổi giá trị sẽ lần lượt thay đổi giá trị cơ bản của NSString của bạn. Điều tương tự cũng xảy ra với NSArrayNSMutableArray ngoại trừ sao chép trên một mảng chỉ sao chép tất cả các tham chiếu con trỏ tới một mảng mới nhưng sẽ ngăn các mục nhập bị xóa và thêm vào.

7

giữ lại: Nó được thực hiện trên đối tượng đã tạo và chỉ tăng số lượng tham chiếu.

sao chép - Nó tạo đối tượng mới và khi đối tượng mới được tạo giữ lại sẽ là 1. Hy vọng điều này có thể giúp bạn.

+0

sao chép không phải lúc nào cũng tạo ra một đối tượng mới – newacct

+0

vì vậy chúng tôi tăng số lượng tham chiếu lên cùng một đối tượng, trong khi đối với bản sao, chúng tôi tăng số lượng tham chiếu trên một đối tượng mới? – Honey

Các vấn đề liên quan