2014-10-31 18 views
7

xin lỗi nếu đó là câu hỏi ngớ ngẩn. Tôi mới bắt đầu học nhanh. Tôi chủ yếu sử dụng php cho công việc hàng ngày của mình. Swift sách giáo khoa Apple Store của sử dụng ví dụ sau (i biến đổi nó thành một phiên bản ngắn hơn) để chứng minh việc sử dụng tài liệu tham khảo yếu:Tại sao Swift không hủy bỏ tham chiếu vòng tròn (chu kỳ tham chiếu mạnh) tự động

class Person { 
    var apartment: Apartment?; 
} 

class Apartment { 
    weak var tenant: Person?; 
} 

var john: Person?;   john = Person(); 
var number73: Apartment?; number73 = Apartment(); 
john!.apartment = number73; number73!.tenant = john;  //circular reference here 

john = nil; number73 = nil;   //deference from static variable names 

Trong định nghĩa lớp Căn hộ cao cấp ở trên, nếu yếu từ khóa được lấy ra từ var tenant, nó tạo chu trình tham chiếu mạnh mẽ trong mã sau để hai trường hợp không được GC xử lý. Tuy nhiên, nó xuất hiện với tôi GC thực sự không cần dấu hiệu của tham chiếu yếu. Rõ ràng là hai trường hợp không thể được liên kết từ bất kỳ biến nào trong phạm vi hiện tại hoặc từ bất kỳ biến tĩnh nào, do đó chúng an toàn để được xử lý.

Tại sao liều Swift buộc cú pháp? Ưu điểm duy nhất tôi có thể tìm ra là từ khóa yếu làm nổi bật logic nên mã dễ đọc hơn.

Trả lời

13

Swift không sử dụng bộ sưu tập rác đánh dấu và quét. Nó sử dụng tính toán tham chiếu. Trong tính tham chiếu, nó được tính có bao nhiêu tham chiếu đến từng đối tượng: mỗi khi một tham chiếu mới đến một đối tượng được tạo, số tham chiếu được tăng lên, và mỗi lần tham chiếu đến đối tượng sẽ bị loại bỏ số tham chiếu bị giảm. Ngay sau khi một đối tượng có tham chiếu bằng không, nó được xử lý. Một trong những điểm yếu chính của tính tham chiếu là cấu trúc tuần hoàn không được xử lý.

Trong ví dụ của bạn, john có tham chiếu đến number73number73 có tham chiếu đến john. Vì vậy, nếu từ khóa weak bị loại bỏ, mỗi đối tượng có ít nhất một tham chiếu đến nó, và vì vậy không có đối tượng nào được xử lý.

Tham khảo yếu giúp phá vỡ chu kỳ. Về cơ bản, các tham chiếu yếu không được tính, và do đó các đối tượng chỉ có các tham chiếu yếu với chúng sẽ bị loại bỏ. Trong ví dụ, vì cá thể Apartment chỉ có tham chiếu yếu với cá thể Person, trường hợp thứ hai có số tham chiếu là 0 và sẽ được xử lý. Sau đó, phiên bản Apartment có số tham chiếu là 0 và cũng sẽ được xử lý.

+0

"Swift không sử dụng bộ sưu tập rác đánh dấu và quét. Nó sử dụng tính toán tham chiếu" để giải thích. –

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