2017-09-22 95 views
0

我正在读有关自动引用计数和初始化和deinitializers 和我正在做以下实用机构的自动引用计数

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") 
 
     } 
 

 
    }

我已经作出一个类象上面,然后我装箱实例像

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

现在我的问题是这个对象是如何des根据ARC troyed,因为我已经创建者是恒定的,所以我不能把它分配给其他对象时,它给了我这个错误

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

但如果我这样做,那么DEINIT方法被调用

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

,然后如果我做

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

然后DEINIT方法调用,所以到底是怎么回事这里任何一个可以解释我在短暂的

回答

2

因为newPerson是一个非可选Person,你不能分配nil它。但是要取消初始化对象(称之为A),则不需要。当newPerson超出范围时(例如,它声明的函数超出范围),会发生这种情况。

当您构建一个新人(称为B)并将其分配给newPerson时,必须覆盖参考newPerson。由于newPerson是A的最后一个强烈参照,A被初始化