- 快速教程
 - 斯威夫特 - 主页
 - 斯威夫特 - 概述
 - Swift - 环境
 - Swift - 基本语法
 - Swift - 数据类型
 - Swift - 变量
 - Swift - 可选
 - Swift - 元组
 - Swift - 常量
 - Swift - 文字
 - Swift - 运算符
 - Swift - 决策
 - Swift - 循环
 - Swift - 字符串
 - 斯威夫特 - 角色
 - Swift - 数组
 - Swift - 套装
 - 斯威夫特 - 字典
 - Swift - 函数
 - Swift - 闭包
 - Swift - 枚举
 - Swift - 结构
 - Swift - 类
 - Swift - 属性
 - Swift - 方法
 - Swift - 下标
 - Swift - 继承
 - Swift - 初始化
 - Swift - 去初始化
 - Swift - ARC 概述
 - Swift - 可选链接
 - Swift - 类型转换
 - Swift - 扩展
 - Swift - 协议
 - Swift - 泛型
 - Swift - 访问控制
 
- 斯威夫特有用的资源
 - Swift - 在线编译
 - Swift - 快速指南
 - Swift - 有用的资源
 - 斯威夫特 - 讨论
 
Swift - ARC 概述
内存管理函数及其使用是通过自动引用计数 (ARC) 在 Swift 4 语言中处理的。ARC 用于初始化和取消初始化系统资源,从而在不再需要实例时释放类实例使用的内存空间。ARC 跟踪有关代码实例之间关系的信息,以有效管理内存资源。
ARC的功能
每次 init() 创建新的类实例时,ARC 都会分配一块内存来存储信息。
有关实例类型及其值的信息存储在内存中。
当不再需要类实例时,它会通过 deinit() 自动释放内存空间,以便进一步存储和检索类实例。
ARC 跟踪当前引用的类实例属性、常量和变量,以便 deinit() 仅应用于那些未使用的实例。
ARC 维护对这些类实例属性、常量和变量的“强引用”,以在当前使用类实例时限制释放。
ARC计划
class StudDetails {
   var stname: String!
   var mark: Int!
   
   init(stname: String, mark: Int) {
      self.stname = stname
      self.mark = mark
   }
   deinit {
      print("Deinitialized \(self.stname)")
      print("Deinitialized \(self.mark)")
   }
}
let stname = "Swift 4"
let mark = 98
print(stname)
print(mark)
当我们使用 Playground 运行上述程序时,我们得到以下结果 -
Swift 4 98
ARC 强引用循环类实例
class studmarks {
   let name: String
   var stud: student?
   
   init (name: String) {
      print("Initializing: \(name)")
      self.name = name
   }
   deinit {
      print("Deallocating: \(self.name)")
   }
}
class student {
   let name: String
   var strname: studmarks?
   
   init (name: String) {
      print("Initializing: \(name)")
      self.name = name
   }
   deinit {
      print("Deallocating: \(self.name)")
   }
}
var shiba: studmarks?
var mari: student?
shiba = studmarks(name: "Swift 4")
mari = student(name: "ARC")
shiba!.stud = mari
mari!.strname = shiba
当我们使用 Playground 运行上述程序时,我们得到以下结果 -
Initializing: Swift 4 Initializing: ARC
ARC 弱引用和无主引用
类类型属性有两种方法来解决强引用循环 -
- 弱引用
 - 无主参考文献
 
这些引用用于使一个实例能够在引用循环中引用其他实例。然后实例可以引用每个实例而不用关心强引用循环。当用户知道某些实例可能返回“nil”值时,我们可能会指出使用弱引用。当实例要返回某些内容而不是 nil 时,请使用无主引用声明它。
弱引用程序
class module {
   let name: String
   init(name: String) { self.name = name }
   var sub: submodule?
   deinit { print("\(name) Is The Main Module") }
}
class submodule {
   let number: Int
   init(number: Int) { self.number = number }
   weak var topic: module?
   deinit { print("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
当我们使用 Playground 运行上述程序时,我们得到以下结果 -
ARC Is The Main Module Sub Module with its topic number is 4
无主参考程序
class student {
   let name: String
   var section: marks?
   init(name: String) {
      self.name = name
   }
   deinit { print("\(name)") }
}
class marks {
   let marks: Int
   unowned let stname: student
   
   init(marks: Int, stname: student) {
      self.marks = marks
      self.stname = stname
   }
   deinit { print("Marks Obtained by the student is \(marks)") }
}
var module: student?
module = student(name: "ARC")
module!.section = marks(marks: 98, stname: module!)
module = nil
当我们使用 Playground 运行上述程序时,我们得到以下结果 -
ARC Marks Obtained by the student is 98
闭包的强引用循环
当我们将闭包分配给类实例属性和闭包主体以捕获特定实例时,可能会发生强引用循环。对闭包的强引用由“self.someProperty”或“self.someMethod()”定义。强引用循环用作闭包的引用类型。
class HTMLElement {
   let samplename: String
   let text: String?
   
   lazy var asHTML: () -> String = {
      if let text = self.text {
         return "<\(self.samplename)>\(text)</\(self.samplename)>"
      } else {
         return "<\(self.samplename) />"
      }
   }
   init(samplename: String, text: String? = nil) {
      self.samplename = samplename
      self.text = text
   }
   deinit {
      print("\(samplename) is being deinitialized")
   }
}
var paragraph: HTMLElement? = HTMLElement(samplename: "p", text: "Welcome to Closure SRC")
print(paragraph!.asHTML())
当我们使用 Playground 运行上述程序时,我们得到以下结果 -
<p>Welcome to Closure SRC</p>
弱引用和无主引用
当闭包和实例相互引用时,用户可以将闭包中的捕获定义为无主引用。那么它就不允许用户同时释放实例。当实例有时返回“nil”值时,使用弱实例定义闭包。
class HTMLElement {
   let module: String
   let text: String?
   
   lazy var asHTML: () -> String = {
      [unowned self] in
      if let text = self.text {
         return "<\(self.module)>\(text)</\(self.module)>"
      } else {
         return "<\(self.module) />"
      }
   }
   init(module: String, text: String? = nil) {
      self.module = module
      self.text = text
   }
   deinit {
      print("\(module) the deinit()")
   }
}
var paragraph: HTMLElement? = HTMLElement(module: "Inside", text: "ARC Weak References")
print(paragraph!.asHTML())
paragraph = nil
当我们使用 Playground 运行上述程序时,我们得到以下结果 -
<Inside>ARC Weak References</Inside> Inside the deinit()