我正在学习快速编程语言,目前主题为 garbige collection
class Person{
var firstName: String
var lastName: String
init(firstName: String, lastName: String){
self.firstName = firstName
self.lastName = lastName
}
deinit{
print("\(firstName) \(lastName) is being removed from momory!")
}
}
var john = Person(firstName: "Johhny", lastName: "Appleseed")
john = Person(firstName: "Frank", lastName: "koin")
john = Person(firstName: "kayano", lastName: "izuku")
对象john
,AKA" Johhny"的实际值"苹果籽" "弗兰克" ...,保存在堆空间中,在Swift从内存中删除对象之前,函数deinit
可以告诉我将删除哪个对象。
问题1 :对象的名称如何,例如 john ,它在哪里存储,堆叠或堆?我能把它摧毁吗?
问题2 :有人可以向我推荐一些计算机科学基础书籍,这样我就可以拥有像这样的知识,或者像堆栈一样的知识,编译器的工作方式等等。
评论:我认为john = nil
可以完成这项艰巨的工作,如果我错了,请纠正我
答案 0 :(得分:0)
名称john
仅在编译期间需要,并且根本不在运行时。但是,如果你的意思是引用该对象的john
变量,那么它在概念上就是在堆栈上(仅在此范围内可用),但是编译器可以通过多种方式对其进行优化,因此它可能只是在寄存器中或被删除(因为你在分配后从不使用它)
另外,为了消除你的误解 - 这不是垃圾收集。 Swift实现自动引用计数(ARC) - 它具有自动释放未使用对象的内存的效果,但是不同。你遇到的主要问题是ARC无法处理循环引用(即两个引用彼此的对象),而垃圾收集器可以。