Trạng thái Wikipedia "Trong lập trình máy tính, tham chiếu yếu là tham chiếu không bảo vệ đối tượng được tham chiếu khỏi bộ sưu tập của bộ thu gom rác". Hai loại tham chiếu đó trông như thế nào trong mã? Tham chiếu yếu có phải là tham chiếu được tạo bởi thông điệp tự động phát hành không?Tham chiếu yếu và mạnh trông như thế nào trong mục tiêu-c?
Trả lời
Câu trả lời sau dành cho trường hợp không có bộ sưu tập rác (chẳng hạn như trên iOS). Trong trường hợp thu gom rác, thực sự có một từ khóa (__weak
) để tạo một tham chiếu yếu.
Tham chiếu "yếu" là tham chiếu mà bạn không giữ lại.
Bạn cần sử dụng các tham chiếu yếu này để chia nhỏ chu kỳ. Một trường hợp phổ biến là một đối tượng con cần tham chiếu đến đối tượng cha của nó. Trong trường hợp này, phụ huynh sẽ giữ lại một tham chiếu đến đối tượng con, và đối tượng con có một tham chiếu đến cha của nó, nhưng không giữ lại nó. Điều này làm việc vì đối tượng con chỉ cần tồn tại miễn là đối tượng cha làm.
Tham chiếu yếu có phải là tham chiếu được tạo bởi thông điệp tự động phát hành không?
Không thực sự, đó sẽ là một "tài liệu tham khảo rất yếu" ;-)
thứ Auto-phát hành sẽ biến mất khi các cuộc gọi stack là unwound (ở cuối mỗi vòng lặp sự kiện ví dụ). Nếu bạn cần bất cứ điều gì để được ít tạm thời, bạn cần phải giữ lại một tài liệu tham khảo (hoặc như trong trường hợp trên chắc chắn rằng một số phần khác giữ lại nó đầy đủ).
Tham chiếu yếu là tham chiếu không đủ mạnh để buộc đối tượng ở lại trong bộ nhớ trong khi tham chiếu mạnh buộc một đối tượng vẫn còn trong bộ nhớ.
Nếu bạn đã tạo tham chiếu yếu cho bất kỳ biến nào, bạn có thể nhận được số không cho điều đó.
UITableViewDelegate
, UIScrollViewDelegate
, v.v ... là ví dụ về các tham chiếu yếu.
Ví dụ về tài liệu tham khảo mạnh:
MyClass *obj1 = [[Myclass alloc] init];
Myclass *obj2 = obj1;
Đây obj2
có tài liệu tham khảo mạnh để obj1
có nghĩa là nếu bạn loại bỏ obj2
từ bộ nhớ sau đó obj1
cũng sẽ bị xóa.
obj2 thực sự có một tham chiếu mạnh mẽ để obj1? Bạn nói "Tham chiếu yếu là một tham chiếu không đủ mạnh để buộc một đối tượng ở lại trong bộ nhớ", và xem ví dụ của bạn, gửi một thông báo phát hành tới obj1 sẽ không ngăn cản obj1 bị giữ lại trong bộ nhớ vì " Myclass * obj2 = obj1; " nhiệm vụ không tăng số lượng giữ lại trên obj1. IMHO nó là một tham chiếu yếu. – Centurion
Bạn có thể giải thích cho tôi tham chiếu mạnh mẽ không ?? – Hitesh
Tôi nghĩ, một câu lệnh thứ hai "[obj2 retain];" sẽ làm cho nó trở thành một tham chiếu mạnh mẽ. Có, obj2 chỉ là một con trỏ để obj1 và cả 2 giữ lại đếm thuộc về cùng một đối tượng được phân bổ trong bộ nhớ và IMHO được lưu trữ ở một nơi nào đó.Nhưng mỗi +1 giữ lại có một chủ sở hữu (ít nhất là lý thuyết) và cho tôi tốt hơn để nghĩ về chủ sở hữu đó là var/ivar/property đã được sử dụng để gửi một thông báo giữ lại (giữ lại) hoặc ẩn (cấp phát) rõ ràng trên đích vật. – Centurion
Tôi chủ yếu quan tâm đến iOS SDK. Về iOS 4: vậy, hãy làm tất cả các thuộc tính "gán kiểu" và bất kỳ phép gán đơn giản nào khác của một con trỏ obj này đến con trỏ khác mà không giữ lại thông điệp rõ ràng phải được coi là tham chiếu yếu? – Centurion
Có. Nhưng lưu ý rằng các phương thức như "phân bổ" bao gồm một "giữ lại" tiềm ẩn. – Thilo
@Thillo Nếu chúng ta đang sử dụng các thuộc tính, thì 'weak' có giống như' assign' không? –