swift----內(nèi)存管理

內(nèi)存管理不管是在ObjectC 還是swift上雹有,在開發(fā)過程中都是我們需要關(guān)注的一個(gè)重點(diǎn)。剛好學(xué)習(xí)到臼寄,做此筆記

1.類的初始化和類的銷毀

1.類初始化使用init關(guān)鍵字霸奕;
2.類的銷毀使用deinit關(guān)鍵字。

eg:

class Student{
    let name : String
    var website = "JournalDev"
    //初始化
    init(name:String){
        self.name = name
        print("\(name) is being initialized")
    }
    //釋放變量:自動(dòng)釋放吉拳,不能手動(dòng)調(diào)用质帅。
    deinit {
        print("\(name) is being deinitialized")
        print("\(website) is being deinitialized")
    }
}

var s : Student? = Student(name:"Chloe")
//打印結(jié)果:Chloe is being initialized
var reference = s//此時(shí)reference引用了s
var reference2 = reference//reference2引用了reference

//因?yàn)轭愂且妙愋停藭r(shí)留攒,s被reference引用煤惩;reference被reference2引用;
reference = nil//reference is nil炼邀;沒有走deinit方法
s = nil//s is nil魄揉;沒有走deinit方法
reference2 = nil//走deinit方法

//打印結(jié)果:
//Chloe is being deinitialized
//JournalDev is being deinitialized
//從上面的例子可以看出,只有對(duì)類的引用全部無(wú)效時(shí)拭宁,類才被釋放洛退。

2.循環(huán)引用(強(qiáng)引用)

因?yàn)轭愂且妙愋桶旮院苋菀自斐裳h(huán)引用,導(dǎo)致類不能被釋放兵怯;
eg:

class Major {
    let name : String
    var university : University?//引用了University類
    init(name : String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

class University{
    let uniName : String
    init(uniName : String) {
        self.uniName = uniName
    }
    var major : Major?//引用了Major類
    deinit {
        print("University \(uniName) is being deinitialized")
    }
}
//Major類和University此時(shí)是循環(huán)引用狀態(tài)〔守埃現(xiàn)在我們對(duì)兩個(gè)類進(jìn)行初始化
var meMajor: Major?
var uni: University?

meMajor = Major(name: "John Doe")
uni = University(uniName: "IIT")

meMajor?.university = uni
uni?.student = meMajor

meMajor = nil
uni = nil

當(dāng)我們給meMajor和uni都置為nil時(shí),此時(shí)發(fā)現(xiàn)Major和University都沒有被釋放媒区;然后我們看一下怎么解決驼仪。

先了解一下引用類型:

引用類型有三種:strong、weak袜漩、unowned reference;
(1)strong:強(qiáng)引用是默認(rèn)情況下創(chuàng)建的引用的標(biāo)準(zhǔn)類型绪爸。
(2)weak:弱引用允許創(chuàng)建實(shí)例,但不計(jì)入弧的引用計(jì)數(shù)噪服。通常毡泻,當(dāng)一個(gè)引用的生存期比另一個(gè)引用短時(shí),應(yīng)該將其標(biāo)記為弱引用粘优。弱引用可以為nil仇味。
(3)unowned references:無(wú)主引用與弱引用類似,只是它們用于比其他引用具有更長(zhǎng)生存期的引用雹顺。只有在絕對(duì)確定引用確實(shí)存在時(shí)才應(yīng)該使用無(wú)主引用丹墨,否則如果在nil引用上調(diào)用它,它將崩潰嬉愧。也就是無(wú)主引用不可以置為nil贩挣。

解決辦法:所以上面的循環(huán)引用,我們可以用弱引用或者無(wú)主引用來(lái)解決循環(huán)引用問題没酣。只要在屬性前面添加weak關(guān)鍵字就可以
class Major {
    let name : String
    weak var university : University?
    init(name : String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

class University{
    let uniName : String
    init(uniName : String) {
        self.uniName = uniName
    }
    weak var major : Major?
    deinit {
        print("University \(uniName) is being deinitialized")
    }
}
var meMajor: Major?
var uni: University?

meMajor = Major(name: "John Doe")
uni = University(uniName: "IIT")

meMajor?.university = uni
uni?.major = meMajor

meMajor = nil
uni = nil
//打印結(jié)果:
//University IIT is being deinitialized
//John Doe is being deinitialized

3.閉包循環(huán)引用

使用捕獲列表解析閉包中的引用循環(huán)王财;閉包是引用類型,所以也會(huì)造成循環(huán)引用裕便。
閉包中使用了[unowned self]和[weak self]都不會(huì)造成閉包循環(huán)引用問題绒净。

class User {
    
    let name: String
    let skill: String
    //會(huì)造成循環(huán)引用
//    lazy var summary: () -> String = {
//        return "\(self.name) (\(self.skill))"
//    }
    
    //不會(huì)造成循環(huán)引用
//    lazy var summary: () -> String = {[unowned self] in
//        return "\(self.name) (\(self.skill))"
//    }
    //也不會(huì)造成循環(huán)引用
    lazy var summary:() -> String = {[weak self] in
        guard let weakSelf = self else { return }
        return "\(weakSelf.name) (\(weakSelf.skill))"
    }
    
    init(name: String, skill: String) {
        self.name = name
        self.skill = skill
    }
    
    deinit {
        print("Deallocated User")
    }
    
}

var name: User? = User(name: "Anupam", skill: "Swift")

name?.summary()

name = nil
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市偿衰,隨后出現(xiàn)的幾起案子挂疆,更是在濱河造成了極大的恐慌,老刑警劉巖下翎,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缤言,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡视事,警方通過查閱死者的電腦和手機(jī)胆萧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俐东,“玉大人鸳碧,你說我怎么就攤上這事盾鳞。” “怎么了瞻离?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵腾仅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我套利,道長(zhǎng)推励,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任肉迫,我火速辦了婚禮验辞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喊衫。我一直安慰自己跌造,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布族购。 她就那樣靜靜地躺著壳贪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寝杖。 梳的紋絲不亂的頭發(fā)上违施,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音瑟幕,去河邊找鬼磕蒲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛只盹,可吹牛的內(nèi)容都是我干的辣往。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼殖卑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼排吴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懦鼠,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屹堰,沒想到半個(gè)月后肛冶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扯键,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年睦袖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荣刑。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馅笙,死狀恐怖伦乔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情董习,我是刑警寧澤烈和,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站皿淋,受9級(jí)特大地震影響招刹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窝趣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一疯暑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哑舒,春花似錦妇拯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至预麸,卻和暖如春瞪浸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吏祸。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工对蒲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贡翘。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓蹈矮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鸣驱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泛鸟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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