程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift編程頂用以治理內存的主動援用計數詳解

Swift編程頂用以治理內存的主動援用計數詳解

編輯:更多關於編程

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 運轉下面的法式,獲得以下成果。

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 運轉下面的法式,獲得以下成果。

Initializing: Swift
Initializing: ARC

ARC弱和無主參考
Class類型屬性有兩種辦法可以處理強援用周期:

  1. 弱援用
  2. 無主參考
  3. 這些援用是用來使一個實例指在一個基准周期其他實例。然後實例可認為每個實例參考取代處置強援用周期。當用戶曉得某些情形下能夠會前往 '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 運轉下面的法式,獲得以下成果。

    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 運轉下面的法式,獲得以下成果。

    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 運轉下面的法式,獲得以下成果。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved