3 votes

Type de référence dans la catégorie de valeur

Je suis en train d'explorer les types de valeurs Swift, en particulier les structs, pour mieux comprendre leur utilisation dans différents scénarios. J'ai été étonné de voir comment un enum peut être utilisé pour construire un arbre de recherche binaire en utilisant des structs. indirect qui introduit une fine couche de sémantique de référence.

enum BinarySearchTree<T: Comparable> {
  case empty
  case leaf(T)
  indirect case node(BinarySearchTree, T, BinarySearchTree)
}

Pour en venir à la vraie question, ce que j'ai du mal à trouver, c'est ce qu'il advient du type de référence dans un type de valeur. Comment la relation fonctionnera-t-elle ? comme la gestion de la mémoire, le cycle de vie des objets.

Par exemple

class B {
    var data: Int = 0

    deinit {
        print("deallocated!")
    }

}

struct A {
    var b = B()
}

Dans le cas ci-dessus, un type de valeur contient une référence à un type de référence.

  1. Quand est-ce que deinit seront appelés ?
  2. Est-ce que chaque nouvelle instance de struct de type A aura une référence à la même instance de la classe B ou seront-ils différents.
  3. Que dois-je faire si c'est une odeur de code ?
  4. Autre chose ?

1voto

paulvs Points 386

Vous pouvez tester cela dans une cour de récréation :

class B {
    var data: Int = 0

    deinit {
        print("deallocated!")
    }
}

struct A {
    var b = B()
}

var a1: A? = A()
var a2: A? = A()
var a3: A? = a1

// Do the two instances of struct A share the same instance of class B?
a1?.b === a2?.b // false

// Do copies of instances of struct A share the same instance of class B?
a1?.b === a3?.b // true

// When will deinit be called?
a1 = nil    // Not yet, a3 still holds a strong reference to the shared instance of class B
a3 = nil    // Now! There are no longer any strong references to the shared instance of class B, so it is deallocated.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X