Właśnie bawiłem się przeciekami i starałem się je stworzyć celowo. Tak, to jest głupie nawet zrobić coś takiego:Wycie wykryto w instrumentach między dwoma lokalnymi vars
class LeakingObjectA{
var strongRefToB:LeakingObjectB?
deinit{ print("LeakingObjectA deinit")}
}
class LeakingObjectB{
var strongRefToA:LeakingObjectA?
deinit{ print("LeakingObjectB deinit")}
}
to jest w porządku dla celów naukowych, a to tworzy silne cyklu odniesienia.
Teraz wewnątrz didMoveToView
Oświadczam lokalnych stałe i dokonać wyciek takiego:
override func didMoveToView(view: SKView) {
let a = LeakingObjectA()
let b = LeakingObjectB()
a.strongRefToB = b
b.strongRefToA = a
}
Po przejściu do innej sceny, scena na deinit
nazywa się poprawnie, ale deinits
z a
i b
przypadkach nie są faktycznie nazywany.
Także mówię wyciek bo to jest rzeczywiście wykryto w instrumentach jako wyciek:
Teraz jest różnica między tym, co Instruments wykryć jak wyciek, jeśli Oświadczam tych dwóch lokalnych vars jak właściwości sceny:
class GameScene:SKScene {
let a = LeakingObjectA()
let b = LeakingObjectB()
//...later in didMoveToView method I make a strong reference cycle like from the example above
}
oczywiście w tym przypadku, scena na deinit
nazywa się także po przejściu, i tak samo jak powyżej, deinits
od a
i b
wystąpienia nie są wywoływane (z powodu silnego cyklu odniesienia).
Wciąż jest to nie wykryte jako wyciek w przyrządach ... Jakie byłoby rozsądne wytłumaczenie tego?
Czy pytasz, dlaczego jest to przeciek, gdy masz je jako zmienne lokalne, ale nie wtedy, gdy czynisz je globalnymi dla klasy? Czy nie byłoby tak dlatego, że twoja instancja jest nadal dostępna z jakiegoś referencji. Ale zmienne lokalne tego nie robią. (Gdybyś potraktował to jak drzewo, twoje zmienne sceniczne nadal mają dołączoną gałąź, ale twoje zmienne lokalne są po prostu unoszone gdzieś w przestrzeni) – Knight0fDragon
@ Knight0fDragon Hm, ale tak nie jest w tym przypadku, jeśli rozumiem cię poprawnie. .. "Drzewo" (które jest sceną) zniknęło tutaj po przejściu, a także nazywa się deinit sceny, więc silne odniesienia od sceny do tych instancji również minęły. I oczywiście, te instancje nadal istnieją (deinit z nich nie jest nazywany), ale nie jest to wykrywane jako przeciek, jak w przypadku lokalnych zmiennych. – Whirlwind
Och, źle to przeczytałem, myślałem, że powiedziałeś, że deinit sceny nie został wywołany, więc w obu przypadkach scena już nie istnieje. ale same obiekty wciąż istnieją, dlaczego miejscowi są uważani za przecieki, a globale nie? jest tutaj pytanie. W tym momencie jedyną różnicą, o której mogę pomyśleć, jest to, że locale są na stosie, ale globale są w kupce. – Knight0fDragon