Swift 自動引用計數(shù)

引用計數(shù)

import UIKit

class OnePerson {
    let name: String
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    
    deinit {
        print("\(name) is being deinitialized")
    }
}

var reference1: OnePerson?
var reference2: OnePerson?
var reference3: OnePerson?

reference1 = OnePerson(name: "Xiao Yao")

reference2 = reference1
reference3 = reference1

print("reference1 nil")
reference1 = nil
print("reference2 nil")
reference2 = nil
print("reference3 nil")
reference3 = nil

console log 如下


ARC截圖1.png

weak 防止循環(huán)強(qiáng)引用

import UIKit

// weak 防止循環(huán)強(qiáng)引用
class Person {
    let name: String
    init(name: String) {
        self.name = name
    }
    
    var apartment: Apartment?
    deinit {
        print("\(name) is being deinitialized")
    }
}

class Apartment {
    let unit: String
    init(unit: String) {
        self.unit = unit
    }
    weak var tenant: Person?
    deinit {
        print("Apartment \(unit) is being deinitialized")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "Jhon Applesseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john

print("John nil")
john = nil
print("unit4A nil")
unit4A = nil

console log 如下


ARC截圖2.png

注意: Person 和Apartment 關(guān)系分析


weak關(guān)鍵字.png

unowned 關(guān)鍵字

import UIKit

// unowned 關(guān)鍵字
class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("Customer \(name) is being deinitialized")
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
    
    deinit {
        print("Card #\(number) is being deinitialized")
    }
}

var john: Customer?
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
john = nil

console log 如下


ARC截圖3.png

注意: Customer 和 CreditCard 關(guān)系如下


unowned關(guān)鍵字.png

unowned 例子

import UIKit

class Country {
    let name : String
    var capitalCity: City!
    init(name: String, capitalName:String){
        self.name = name
        self.capitalCity = City(name: capitalName, country: self)
    }
}

class City {
    let name: String
    unowned let country: Country
    init(name: String, country: Country) {
        self.name = name
        self.country = country
    }
}

var country = Country(name: "China", capitalName: "BeiJing")
print("\(country.name)'s capital city is called \(country.capitalCity.name)")

console log 如下


ARC截圖4.png

避免閉包的循環(huán)強(qiáng)引用

//: Playground - noun: a place where people can play

import UIKit

// 避免閉包的循環(huán)強(qiáng)引用
class HTMLElement {
    let name: String
    let text: String?
    lazy var asHTML: () -> String = {
        [unowned self] in
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }
    
    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }
    
    deinit {
        print("\(name) is being deinitialized")
    }
}

var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
print(paragraph!.asHTML())
paragraph = nil

console log 如下


ARC截圖5.png

注意: 分析如下


閉包避免循環(huán)強(qiáng)引用.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厌蔽,一起剝皮案震驚了整個濱河市隶校,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酸些,老刑警劉巖取募,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琐谤,死亡現(xiàn)場離奇詭異,居然都是意外死亡玩敏,警方通過查閱死者的電腦和手機(jī)斗忌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門质礼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人织阳,你說我怎么就攤上這事眶蕉。” “怎么了唧躲?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵造挽,是天一觀的道長。 經(jīng)常有香客問我弄痹,道長饭入,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任肛真,我火速辦了婚禮谐丢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚓让。我一直安慰自己乾忱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布历极。 她就那樣靜靜地躺著窄瘟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趟卸。 梳的紋絲不亂的頭發(fā)上蹄葱,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音衰腌,去河邊找鬼新蟆。 笑死,一個胖子當(dāng)著我的面吹牛右蕊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吮螺,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饶囚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸠补?” 一聲冷哼從身側(cè)響起萝风,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紫岩,沒想到半個月后规惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泉蝌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年歇万,在試婚紗的時候發(fā)現(xiàn)自己被綠了揩晴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贪磺,死狀恐怖硫兰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寒锚,我是刑警寧澤劫映,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站刹前,受9級特大地震影響泳赋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喇喉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一摹蘑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轧飞,春花似錦衅鹿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掸绞,卻和暖如春泵三,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衔掸。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工烫幕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敞映。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓较曼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親振愿。 傳聞我的和親對象是個殘疾皇子捷犹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容