2017-06-26 36 views
6

Tôi tò mò liệu mã tiếp theo có dẫn đến chu trình tham chiếu mạnh không?Không enum giữ lại đối tượng liên quan của nó?

enum Type { 
    case some(obj:Any) 
} 

class Entity { 
    var type:Type 
    init() { 
     type = Type.some(obj:self) 
    } 
} 
+0

Mã đó không thể tạo chu trình tham chiếu vì 1) không có đối tượng nào được tạo, 2) mã không biên dịch chút nào. –

+0

@MartinR, phải. Hãy coi nó là mã giả –

Trả lời

4

Có. Any hoàn toàn mạnh mẽ. Nếu bạn vượt qua một loại tham chiếu, nó sẽ là một tham chiếu mạnh mẽ. Nó không phải là một "chu kỳ" vì không có gì "giữ lại" một enum, nhưng miễn là giá trị tồn tại (hoặc bất kỳ bản sao của giá trị), nó sẽ giữ Entity và ngăn không cho nó được deallocated.

Hãy tưởng tượng nếu nó không đúng. Điều gì sẽ .some(obj: NSObject()) chứa? Nếu Type.some không tăng số lượng giữ lại, số NSObject sẽ biến mất. (Vì đây là rất giống với một Optional, đó sẽ là rất đáng ngạc nhiên, vì nhiều T? sẽ ngay lập tức trở thành nil.)

BTW, đây là cách dễ dàng và hữu ích khám phá bằng cách tạo ra một phương pháp deinit trên Entity.

+0

vì vậy, thuộc tính 'type' sẽ không giữ lại bản thân bằng cách gói nó trong trường hợp enum? –

+0

ok, tôi đã kiểm tra nó bằng cách sử dụng deinit, và nó không bao giờ được gọi cho đến khi 'type = Type.some (obj: self)' –

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