服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Swift - Swift编程中用以管理内存的自动引用计数详解

Swift编程中用以管理内存的自动引用计数详解

2020-12-23 15:37Swift教程网 Swift

这篇文章主要介绍了Swift编程中用以管理内存的自动引用计数详解,是Swift入门学习中的基础知识,需要的朋友可以参考下

Swift 内存管理功能是通过使用自动引用计数(ARC)来处理。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 {
        println("Deinitialized \(self.stname)")
        println("Deinitialized \(self.mark)")
    }
}

 

let stname = "swift"
let mark = 98

println(stname)
println(mark)


当我们使用 playground 运行上面的程序,得到以下结果。

 

?
1
2
swift
98

ARC 强参考周期类实例

复制代码 代码如下:


class studmarks {
    let name: String
    var stud: student?
   
    init (name: String) {
        println("Initializing: \(name)")
        self.name = name
    }
   
    deinit {
        println("Deallocating: \(self.name)")
    }
}

 

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


当我们使用 playground 运行上面的程序,得到以下结果。

 

?
1
2
Initializing: Swift
Initializing: ARC

ARC弱和无主参考
Class类型属性有两种方法可以解决强引用周期:

  1. 弱引用

  2. 无主参考

这些引用是用来使一个实例指在一个基准周期其他实例。然后实例可以为每一个实例参考代替处理强引用周期。当用户知道某些情况下可能会返回 'nil' 值,我们可能会指向使用弱引用。当实例会返回不是零的东西,然后使用无主参考声明。

弱引用程序

复制代码 代码如下:


class module {
    let name: String
    init(name: String) { self.name = name }
    var sub: submodule?
    deinit { println("\(name) Is The Main Module") }
}

 

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


当我们使用 playground 运行上面的程序,得到以下结果。

 

?
1
2
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 { println("\(name)") }
}
class marks {
    let marks: Int
    unowned let stname: student
   
    init(marks: Int, stname: student) {
        self.marks = marks
        self.stname = stname
    }
   
    deinit { println("Marks Obtained by the student is \(marks)") }
}

 

var module: student?
module = student(name: "ARC")
module!.section = marks(marks: 98, stname: module!)
module = nil


当我们使用 playground 运行上面的程序,得到以下结果。

 

?
1
2
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 {
        println("\(samplename) is being deinitialized")
    }
}

 

var paragraph: HTMLElement? = HTMLElement(samplename: "p", text: "Welcome to Closure SRC")
println(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 {
        println("\(module) the deinit()")
    }
}

 

var paragraph: HTMLElement? = HTMLElement(module: "Inside", text: "ARC Weak References")
println(paragraph!.asHTML())
paragraph = nil


当我们使用 playground 运行上面的程序,得到以下结果。

 

?
1
2
<Inside>ARC Weak References</Inside>
Inside the deinit()

 

延伸 · 阅读

精彩推荐
  • Swift分析Swift性能高效的原因

    分析Swift性能高效的原因

    绝大多数公司选择Swift语言开发iOS应用,主要原因是因为Swift相比Objc有更快的运行效率,更加安全的类型检测,更多现代语言的特性提升开发效率;这一系...

    louis_wang9092021-01-16
  • Swift详解Swift 之clipped是什么如何用

    详解Swift 之clipped是什么如何用

    这篇文章主要介绍了详解Swift 之clipped是什么如何用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    iCloudEnd8532021-05-28
  • SwiftSwift算法之栈和队列的实现方法示例

    Swift算法之栈和队列的实现方法示例

    Swift语言中没有内设的栈和队列,很多扩展库中使用Generic Type来实现栈或是队列。下面这篇文章就来给大家详细介绍了Swift算法之栈和队列的实现方法,需要...

    李峰峰10002021-01-05
  • Swift浅谈在Swift中关于函数指针的实现

    浅谈在Swift中关于函数指针的实现

    这篇文章主要介绍了浅谈在Swift中关于函数指针的实现,是作者根据C语言的指针特性在Swifft中做出的一个实验,需要的朋友可以参考下...

    Swift教程网4372020-12-21
  • SwiftSwift网络请求库Alamofire使用详解

    Swift网络请求库Alamofire使用详解

    这篇文章主要为大家详细介绍了Swift网络请求库Alamofire的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    lv灬陈强56682021-01-06
  • SwiftSwift中排序算法的简单取舍详解

    Swift中排序算法的简单取舍详解

    对于排序算法, 通常简单的, 为大家所熟知的有, 选择排序, 冒泡排序, 快速排序, 当然还有哈希, 桶排序之类的, 本文仅比较最为常见的选择, 冒泡和快排,文...

    Castie111012021-01-10
  • Swiftswift相册相机的权限处理示例详解

    swift相册相机的权限处理示例详解

    在iOS7以后要打开手机摄像头或者相册的话都需要权限,在iOS9中更是更新了相册相关api的调用,那么下面这篇文章主要给大家介绍了关于swift相册相机权限处...

    hello老文12682021-01-08
  • SwiftSwift 基本数据类型详解总结

    Swift 基本数据类型详解总结

    在我们使用任何程序语言编程时,需要使用各种数据类型来存储不同的信息。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明...

    Lucky_William4672021-12-26