2010-03-08 7 views

Trả lời

45

Trong cài đặt chung, việc giữ lại một đối tượng sẽ tăng số lần giữ lại của một đối tượng. Điều này sẽ giúp giữ cho đối tượng trong bộ nhớ và ngăn không cho nó bị thổi bay đi. Điều này có nghĩa là nếu bạn chỉ giữ giữ lại phiên bản của nó, bạn chia sẻ bản sao đó với bất kỳ ai chuyển nó cho bạn.

Sao chép đối tượng, tuy nhiên bạn làm điều đó, nên tạo một đối tượng khác với các giá trị trùng lặp trùng lặp. Hãy nghĩ về điều này như một bản sao. Bạn KHÔNG chia sẻ bản sao với bất kỳ ai truyền nó cho bạn.

Khi giao dịch với NSString s nói riêng, bạn không thể giả định rằng bất kỳ ai cho bạn NSString thực sự cung cấp cho bạn NSString. Ai đó có thể giao cho bạn một lớp con (NSMutableString, trong trường hợp này) có nghĩa là họ có khả năng có thể sửa đổi các giá trị dưới các bìa. Nếu ứng dụng của bạn phụ thuộc vào giá trị được chuyển vào và ai đó thay đổi nó trên bạn, bạn có thể gặp rắc rối.

+15

Cần lưu ý rằng 'copy' tương đương với' giữ lại 'cho hầu hết các lớp' Foundation' không thể thay đổi. – rpetrich

+0

Rất nhiều thông tin .. – Krishnan

+3

Tôi có thể đề xuất rằng "bạn ** chia sẻ ** rằng * cá thể * với bất kỳ ai truyền cho bạn" rõ ràng hơn "bạn ** chia sẻ ** rằng * bản sao * với bất kỳ ai đã chuyển nó cho bạn" ? (Xem như chúng ta đang nói về sao chép đã) –

23

Giữ lại và sao chép là hai việc khác nhau, người đầu tiên là khái niệm gọi-by-reference trong khi thứ hai là gọi theo giá trị.

3

Sự khác biệt lớn nhất là nếu bạn sử dụng copy, đối tượng bạn đang sao chép phải triển khai giao thức NSCopying (rất dễ thực hiện). Không phải mọi đối tượng đều thực hiện điều đó, vì vậy bạn cần phải sử dụng dịch vụ chăm sóc bạn biết chắc chắn bạn sẽ hoạt động với loại nào (hoặc kiểm tra hỗ trợ giao thức đó) khi cố gọi copy.

Quy tắc tốt nhất để sử dụng copy Tôi có thể nghĩ, luôn đặt thuộc tính NSString thành "sao chép" thay vì giữ lại. Bằng cách đó bạn sẽ có được các bài đọc chính xác hơn từ nhạc cụ Rò rỉ nếu bạn lộn xộn và quên phát hành một chuỗi mà một vật thể đang nắm giữ. Sử dụng các bản sao khác cần phải được suy nghĩ cẩn thận hơn.

1

sao chép: tạo phiên bản mới là bản sao của người nhận. Điều đó có nghĩa là bạn sẽ có 2 khác nhau

giữ lại: Tăng số retainCount của người nhận. Một đối tượng được xóa khỏi bộ nhớ - (với dealloc), khi retainCount là 0.

+1

Tôi nghĩ rằng bạn có nghĩa là "dealloc'ed" (một chút khó xử để verbify rằng từ), không "bế tắc" – Brian

5

nếu bạn sử dụng giữ lại, nó sao chép giá trị con trỏ từ giá trị ban đầu. Cũng tăng số đếm tham chiếu một. nhưng trong trường hợp sao chép, nó sao chép dữ liệu được tham chiếu bởi con trỏ và gán nó vào biến cá thể của bản sao.

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.

bản sao - Nó tạo ra một đối tượng mới và khi đối tượng mới được tạo ra giữ lại đếm sẽ được 1.

Hope Trợ giúp này cho U ... :)

0

giữ lại thuộc tính được quy định như vậy nó có thể giữ lại bộ nhớ khác i.e nó có thể được thực hiện để trỏ đến một địa chỉ khác cũng sao chép Đầu tiên sao chép địa chỉ và sau đó giữ lại nó.

6

Bài đăng cũ của nó nhưng đây là quan điểm của tôi về câu hỏi

Giữ lại tăng số lần giữ lại của đối tượng bằng 1 và chiếm quyền sở hữu đối tượng.

Trong khi sao chép sẽ sao chép dữ liệu có trong vị trí bộ nhớ và gán nó cho biến sao cho trong trường hợp sao chép, trước tiên bạn sao chép dữ liệu từ vị trí gán cho biến làm tăng số lần giữ lại.

Chỉ cần nhớ rằng giữ lại hoạt động trên tài liệu tham khảo và sao chép hoạt động trên giá trị

+0

Giữ lại không sao chép tham chiếu. –

+0

Bản sao 'tạo' có tạo đối tượng mới không ?? , – Dhiru