Stavo solo giocando con perdite e ho cercato di crearne uno intenzionalmente. Quindi, anche se è stupido fare qualcosa di simile a questa:Perdita rilevata in Strumenti tra due vars locali
class LeakingObjectA{
var strongRefToB:LeakingObjectB?
deinit{ print("LeakingObjectA deinit")}
}
class LeakingObjectB{
var strongRefToA:LeakingObjectA?
deinit{ print("LeakingObjectB deinit")}
}
va bene per gli scopi scientifici, e questo crea un ciclo di riferimento forte.
Ora all'interno didMoveToView
dichiaro costanti locali e fare una perdita come questa:
override func didMoveToView(view: SKView) {
let a = LeakingObjectA()
let b = LeakingObjectB()
a.strongRefToB = b
b.strongRefToA = a
}
Dopo il passaggio a un'altra scena, della scena deinit
si chiama correttamente, ma deinits
da a
e b
casi non sono effettivamente chiamato.
Anche io dico Leak perché questo è in realtà rilevato in strumenti come una perdita:
Ora c'è una differenza tra quello che Instruments rilevare come la fuga se dichiaro queste due Vars locali come proprietà di una scena:
class GameScene:SKScene {
let a = LeakingObjectA()
let b = LeakingObjectB()
//...later in didMoveToView method I make a strong reference cycle like from the example above
}
Naturalmente in questo caso, il deinit
scena è chiamato così dopo la transizione, e come sopra, 012.da a
e b
istanze non chiamate chiamate (a causa del ciclo di riferimento intenso).
Ancora, questo è non rilevato come perdita in Strumenti ... Quindi quale sarebbe la spiegazione ragionevole per questo?
Stai chiedendo perché è una perdita quando li hai come variabili locali, ma non quando li rendi globali alla classe? Non sarebbe perché la tua istanza è ancora accessibile da qualche riferimento in attesa. Ma le tue variabili locali no. (Se dovessi trattare questo come un albero, le tue variabili di scena hanno ancora un ramo collegato, ma le tue variabili locali stanno semplicemente fluttuando nello spazio da qualche parte) – Knight0fDragon
@ Knight0fDragon Hm, ma questo non è il caso qui se ti capisco correttamente. .. "L'albero" (che è la scena) è andato qui dopo la transizione, e anche il deinit della scena è chiamato, quindi anche i riferimenti forti dalla scena a quelle istanze sono andati. E ovviamente, quelle istanze sono ancora lì (non viene chiamato da loro), ma questo non viene rilevato come una perdita, come nel caso delle vars locali. – Whirlwind
Oh, ho letto male, pensavo avessi detto che il deinit della scena non veniva chiamato, quindi in entrambi i casi la scena non esiste più. ma gli oggetti stessi esistono ancora, perché gli abitanti del luogo considerano le fughe e i globali no? è la domanda qui. A questo punto l'unica differenza che posso pensare è che i locali sono in pila, ma i globali sono nell'heap – Knight0fDragon