当前位置: 首页 > 文档资料 > Swift 中文教程 >

ARC 概述

优质
小牛编辑
124浏览
2023-12-01

内存管理功能及其用法通过自动引用计数(ARC)以Swift 4语言处理。 ARC用于初始化和取消初始化系统资源,从而在不再需要实例时释放类实例使用的内存空间。 ARC会跟踪有关代码实例之间关系的信息,以便有效地管理内存资源。

ARC的功能

  • ARC分配一块内存来存储每次init()创建新类实例时的信息。

  • 有关实例类型及其值的信息存储在内存中。

  • 当不再需要类实例时,它会通过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)

当我们使用游乐场运行上述程序时,我们得到以下结果 -

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

当我们使用游乐场运行上述程序时,我们得到以下结果 -

Initializing: Swift 4
Initializing: ARC

ARC弱和无主参考

类类型属性有两种方法可以解决强引用周期 -

  • Weak References
  • Unowned References

这些引用用于使一个实例能够引用参考周期中的其他实例。 然后,实例可以参考每个实例而不是关注强参考循环。 当用户知道某个实例可能返回'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

当我们使用游乐场运行上述程序时,我们得到以下结果 -

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

当我们使用游乐场运行上述程序时,我们得到以下结果 -

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())

当我们使用游乐场运行上述程序时,我们得到以下结果 -

<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

当我们使用游乐场运行上述程序时,我们得到以下结果 -

<Inside>ARC Weak References</Inside>
Inside the deinit()

最后更新:

类似资料

  • 概述 国际化和本地化的目的就是让一个网站应用能做到根据用户语种和指定格式的不同而提供不同的内容。 Django 对文本翻译, 日期、时间和数字的格式化,以及时区提供了完善的支持。 实际上,Django做了两件事: 由开发者和模板作者指定应用的哪些部分应该翻译,或是根据本地语种和文化进行相应的格式化。 根据用户的偏好设置,使用钩子将web应用本地化。 很显然,翻译取决于用户所选语言,而格式化通常取决

  • 虽然Django 满满的便捷性让Web 开发人员活得轻松一些,但是如果不能轻松地部署你的网站,这些工具还是没有什么用处。Django 起初,易于部署就是一个主要的目标。有许多优秀的方法可以轻松地来部署Django: 如何使用WSGI 部署 部署的检查清单 FastCGI 的支持已经废弃并将在Django 1.9 中删除。 如何使用FastCGI、SCGI 和AJP 部署Django 如果你是部署D

  • 本书概述 进程的概念大家都很熟悉,但你是否能准确说出僵尸进程的含义呢?还有 COW(Copy On Write)、Flock(File Lock)、Epoll 和 Namespace 的概念又是否了解过呢? 本书汇集了进程方方面面的基础知识,加上编程实例,保证阅读后能自如地回答以上问题,在项目开发中对进程的优化也有更深的理解。 本书架构 本书按循序渐进的方式介绍进程的基础概念和拓展知识,主要涵盖以

  • Docker在1.12.0和以上版本中增加了swarm模式。通过swarm模式管理的Docker Engines集群称之为“Swarm”。并可以通过Docker CLI来创建Swarm,在Swarm中部署应用服务,以及管理Swarm。 功能特点 在Docker Engines中集成了集群管理功能:通过Docker CLI可以创建一个用来发布应用services的swarm,而不需要安装其他任何额外

  • 这是 Elasticsearch 官方的 PHP 客户端。我们把 Elasticsearch-PHP 设计成低级客户端(低级设计模式),使用时不会偏离 REST API 的用法。 客户端所有方法几乎都与 REST API 对应,而且也与其他编程语言的客户端(如 ruby, python 等)方法结构相似。我们希望这种对应方式可以方便开发者更加容易上手客户端,且以最小的代价快速从一种编程语言转换到另

  • 特点 为什么用 Groovy?