2017-09-22 4 views
0

Je lisais le comptage automatique de référence et initializers et deinitializers et je faisais ci-dessous pratiquemécanisme de référence comptage automatique

class person 
 
    { 
 
     var first_name:String? 
 
     var last_name:String? 
 
     
 
     
 
     init(firstname name:String,lastname lastname:String) { 
 
      
 
      first_name = name 
 
      self.speciality = speciality 
 
      
 
      
 
     } 
 
     
 
     deinit { 
 
      print("object destroyed") 
 
     } 
 

 
    }

J'ai fait une classe comme ci-dessus et j'EMBALLÉES instance comme

let newPerson =person.init(firstname:"string1" lastname:"string2") 

maintenant ma question est de savoir comment cet objet va troyed selon ARC depuis la personne que j'ai créé est constante, je ne peux pas l'attribuer à un autre objet, il me donne cette erreur

error: cannot assign to value: 'newPerson' is a 'let' constant 
 
    newPerson = nil 
 
~~~~~~~~~~ ^

mais si je le fais alors la méthode est appelée deinit

var newPerson = person(firstname:"string1",lastname:"string2") 

puis si je

newPerson = person(firstname:"string2",lastname:"string3") 

puis méthode deinit est appelé ainsi ce qui se passe ici peut me expliquer brièvement

Répondre

2

Parce que newPerson est un Person non en option, vous ne pouvez pas affecter nil à elle. Mais pour désinitialiser l'objet (appelez le A), vous n'en avez pas besoin. Cela se produira lorsque newPerson sortira de sa portée (par exemple, la fonction déclarée est hors de portée).

Lorsque vous construisez une nouvelle personne (appelez-la B) et l'affectez à newPerson, la référence newPerson à A est remplacée. Puisque newPerson était la dernière référence forte à A, A est désinitialisé