首页 > 其他分享 >无涯教程-Swift - 引用计数

无涯教程-Swift - 引用计数

时间:2024-01-29 18:31:51浏览次数:19  
标签:教程 String text self 无涯 ARC print Swift name

内存管理函数及其用法通过自动引用计数(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)

运行上述程序时,我们得到以下输出-

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

Weak Reference程序

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

Unowned Reference 程序

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

参考链接

https://www.learnfk.com/swift/swift-arc-overview.html

标签:教程,String,text,self,无涯,ARC,print,Swift,name
From: https://blog.51cto.com/u_14033984/9471874

相关文章

  • 【教程】iOS如何抓取HTTP和HTTPS数据包经验分享
    ......
  • 小白都会的幻兽帕鲁服务器搭建教程(详细图文)
    简介:由于幻兽帕鲁游戏的火爆,导致其官方服务器频现游戏卡顿掉线,为了能够正常流畅的体验幻兽帕鲁,有不少人都搭建了幻兽帕鲁服务器(私服),网上虽然也有很多幻兽帕鲁服务器搭建教程,但内容专业性有点高,比较适合有技术基础的玩家,对于小白或者第一次搭建游戏私服的用户而言,理解起来还是......
  • 无涯教程-Swift - 解析构造
    在需要释放一个类实例之前,必须调用"deinitializer"来释放内存空间,关键字"deinit"用于取消分配系统资源占用的内存空间。释放内存空间当不再需要实例时,Swift4会自动释放其实例,以释放资源。Swift4通过自动引用计数(ARC)处理实例的内存管理,如自动引用计数中所述。通常,在实例......
  • docker 快速入门实操教程
    docker快速入门实操教程docker,启动!如果安装好docker不知道怎么使用,不理解各个名词的概念,不太了解各个功能的用途,这篇文章应该会对你有帮助。前置条件:已经安装docker并且docker成功启动。最终目的:使用docker替换本地安装的程序并迁移数据(redis、MySQL)。理解概念docker官方提......
  • docker部署(使用docker-compose)手把手教程
    docker部署(使用docker-compose)手把手教程:https://blog.csdn.net/qq_38377190/article/details/125504426?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170650340916800186593495%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=1706......
  • 无涯教程-Swift - 继承
    通常,一个类可以从另一个类继承方法,属性和函数。类可以进一步分类为子类和父类。子类  - 当一个类从另一个类继承属性,方法和函数时,称为子类父类  - 包含从其自身继承其他类的属性,方法和函数的类称为超类Swift4类包含调用和访问方法,属性,函数和覆盖方法的父类,此外,......
  • 无涯教程-Swift - Subscripts(下标)
    Subscripts下标可以访问类,结构和枚举中的集合,序列和列表的元素成员。这些下标用于在索引的帮助下存储和检索值。在someArray[index]的帮助下访问数组元素,而在Dictionary中的后续成员元素可以作为someDicitonary[key]访问。下标声明语法 "subscript"关键字用于定义,用户可以......
  • 【教程】iOS 手机抓包工具介绍及教程
    ......
  • 无涯教程-Swift - Method(方法)
    在Swift4语言中,与特定类型关联的函数称为"方法"。在ObjectiveC中,类用于定义方法,而Swift4语言为用户提供了具有类,结构和枚举方法的灵活性。实例方法在Swift4语言中,可通过方法访问Class,Structures和Enumeration。方法可以写在{}花括号内,它具有对类型的方法和属性的隐式访问,......
  • 无涯教程-Swift - Properties(属性)
    Swift4语言为类,枚举或结构提供属性以关联值。存储属性Swift4引入了存储属性的概念来存储常量和变量的,常量的存储属性由'let'关键字定义,变量的存储属性由'var'关键字定义。在定义期间,存储的属性提供"默认值"初始化期间,用户可以初始化和修改初始值structNumber{var......