2017-06-26 11 views
6

Jestem ciekawy, czy następny kod doprowadzi do silnego cyklu odniesienia?Czy enum zachowuje powiązany obiekt?

enum Type { 
    case some(obj:Any) 
} 

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

Ten kod nie może utworzyć cyklu odniesienia, ponieważ 1) żaden obiekt nie jest tworzony, 2) kod nie kompiluje się w ogóle. –

+0

@MartinR, prawo. Traktuj to jako pseudokod –

Odpowiedz

4

Tak. Any jest niejawnie silny. Jeśli przekażesz typ referencyjny, będzie to silne odniesienie. Nie jest to "cykl", ponieważ nic nie "zachowuje" wyliczenia, ale dopóki istnieje wartość (lub jakakolwiek kopia wartości), zachowuje ona wartość Entity i zapobiega jej anulowaniu.

Wyobraź sobie, że to nieprawda. Co zawiera .some(obj: NSObject())? Jeśli Type.some nie zwiększy liczby retainów, zniknie NSObject. (Ponieważ jest bardzo podobny do Optional, że byłoby bardzo zaskakujące, ponieważ wiele T? natychmiast stać nil).

BTW, to łatwo i skutecznie zbadane przez stworzenie metody deinit na Entity.

+0

, więc własność 'type' nie zachowałaby siebie, zawijając ją w przypadku enum? –

+0

ok, sprawdziłem to za pomocą deinit, i to nigdy nie jest wywoływane dopóki 'type = Type.some (obj: self)' –

Powiązane problemy