Swift 内存管理功能是通过使用自动引用计数(ARC)来处理。ARC用于初始化和取消初始化所述系统资源,从而释放使用的类实例的存储器空间当实例不再需要。ARC跟踪代码的实例有效地管理存储资源之间的关系的信息。
ARC的功能
ARC 程序
let stname = "swift"
let mark = 98
println(stname)
println(mark)
swift 98
ARC 强参考周期类实例
class student {
let name: String
var strname: studmarks?
init (name: String) {
println("Initializing: \(name)")
self.name = name
}
deinit {
println("Deallocating: \(self.name)")
}
}
var shiba: studmarks?
var mari: student?
shiba = studmarks(name: "Swift")
mari = student(name: "ARC")
shiba!.stud = mari
mari!.strname = shiba
Initializing: Swift Initializing: ARC
ARC弱和无主参考
Class类型属性有两种方法可以解决强引用周期:
这些引用是用来使一个实例指在一个基准周期其他实例。然后实例可以为每一个实例参考代替处理强引用周期。当用户知道某些情况下可能会返回 'nil' 值,我们可能会指向使用弱引用。当实例会返回不是零的东西,然后使用无主参考声明。
弱引用程序
class submodule {
let number: Int
init(number: Int) { self.number = number }
weak var topic: module?
deinit { println("Sub Module with its topic number is \(number)") }
}
var toc: module?
var list: submodule?
toc = module(name: "ARC")
list = submodule(number: 4)
toc!.sub = list
list!.topic = toc
toc = nil
list = nil
ARC Is The Main Module Sub Module with its topic number is 4
无主参考程序
var module: student?
module = student(name: "ARC")
module!.section = marks(marks: 98, stname: module!)
module = nil
ARC Marks Obtained by the student is 98
闭包强引用周期
当我们分配一个闭包至类实例属性,闭包的主体以捕获特定实例强参考周期发生。强引用闭合由 self.someProperty 或 self.someMethod()定义。强引用周期用作闭包引用类型。
var paragraph: HTMLElement? = HTMLElement(samplename: "p", text: "Welcome to Closure SRC")
println(paragraph!.asHTML())
<p>Welcome to Closure SRC</p>
弱和无主参考
当闭包和实例相互引用,用户可以定义在一个闭合作为无主引用捕获。它不会允许用户在同一时间解除分配实例。当实例在某个时候返回一个“nil” 定义并使用弱实例的值。
var paragraph: HTMLElement? = HTMLElement(module: "Inside", text: "ARC Weak References")
println(paragraph!.asHTML())
paragraph = nil
<Inside>ARC Weak References</Inside> Inside the deinit()