Swift學(xué)習(xí)_基本語法之下標(biāo)腳本&自動(dòng)引用計(jì)數(shù)

Swift

1. 下標(biāo)腳本

下標(biāo)腳本是訪問對(duì)象、集合或者序列的快捷方式,開發(fā)者不需要調(diào)用實(shí)例指定的賦值和訪問語法兜看,就可以直接訪問所需的數(shù)值,例如perArray[index]狭瞎、perDictionary[index]

// 現(xiàn)在在類中我們定義一個(gè)小標(biāo)語法细移,用關(guān)鍵字subscript
class NumberOfPeople{

    var principalNumber:Int = 0
    var teacherNumber:Int = 0
    var studentNumber:Int = 0

    subscript(index:Int) -> Int{
    
        get{
            switch index{
            case 0:
                return principalNumber
            case 1:
                return teacherNumber
            case 2:
                return studentNumber
            default:
                return 0
            }
        }
    
        set{
            switch index{
            case 0:
                return principalNumber = newValue
            case 1:
                return teacherNumber = newValue
            case 2:
                return studentNumber = newValue
            default:
                return
            }
        }
    }
}

// 實(shí)例對(duì)象
var personNumber = NumberOfPeople()

// 下角標(biāo)的使用
personNumber[0] = 1
personNumber[1] = 20
personNumber[2] = 100

for i in 0...2{

    print(personNumber[i])
}
// 結(jié)果打印   1    20    100

2.自動(dòng)引用計(jì)數(shù)

1.引用簡(jiǎn)介
class Person{

    var name:String
    init(name:String) {
        self.name = name
    }

    deinit {
        print("\(name) is being deinitalized")
    }
}

定義三個(gè)可選類型的Person,初始化自動(dòng)為nil

var person1:Person?
var person2:Person?
var person3:Person?

person1 = Person(name:"Harry")  // 引用數(shù)量為1
person2 = person1   // 引用數(shù)量為2
person3 = person1   // 引用數(shù)量為3

此時(shí)Person的實(shí)例person已經(jīng)有了三個(gè)強(qiáng)引用了

person1 = nil   // 引用數(shù)量為2
person2 = nil   // 引用數(shù)量為1
person3 = nil   // 引用數(shù)量為0 此時(shí)最后一個(gè)搶引用斷開熊锭,所以就會(huì)調(diào)用析構(gòu)函數(shù)deinit弧轧,打印  Harry is being deinitalized
2.類實(shí)例之間的循環(huán)強(qiáng)引用

** 在上面的例子中,ARC會(huì)跟蹤你所創(chuàng)建的Person實(shí)例的引用數(shù)量碗殷,并且會(huì)在Person實(shí)例不再被需要時(shí)銷毀它**

class Person2{

    let name:String
    init(name:String) {
    
        self.name = name
    }
    var apartment:Apartment2?
    deinit {
        print("\(name) is being deinitialized")
    }
}
class Apartment2 {

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

var john:Person2?
var unit4A:Apartment2?

john = Person2(name:"John Appleseed")
unit4A = Apartment2(unit:"4A")

下面這里就造成了循環(huán)引用

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

john = nil      // 這里由于強(qiáng)引用互相持有精绎,不能釋放
3.弱引用

不幸的是,這兩個(gè)實(shí)例關(guān)聯(lián)后會(huì)產(chǎn)生一個(gè)循環(huán)強(qiáng)引用锌妻,對(duì)象各自之間相互持有代乃,我們可以用弱引用或無主引用

swift提供了兩種辦法用來解決你在使用類的屬性時(shí)所遇到的循環(huán)強(qiáng)引用問題:弱引用(weak reference)和無主引用(unowned reference)。弱引用不會(huì)對(duì)其引用的實(shí)例保持強(qiáng)引用仿粹,因?yàn)椴粫?huì)阻止ARC銷毀被引用的實(shí)例搁吓。這個(gè)特性阻止了引用變?yōu)檠h(huán)強(qiáng)引用。聲明屬性或者變量時(shí)吭历,在前面加上weak關(guān)鍵字表明這是一個(gè)弱引用堕仔。

class ApartmentL{

    let unit:String
    init(unit:String) {
        self.unit = unit
    }
    weak var tenant:PersonL?    // 注意這里是一個(gè)weak 表示弱引用
    deinit {
        print("Apartment \(unit) is being deinitialized")
    }
}

class PersonL {

    let name:String
    init(name:String) {
        self.name = name
    }

    var apartment:ApartmentL?
    deinit {
        print("\(name) is being deinitialized")
    }
}

var johnl:PersonL?
var unit4Al:ApartmentL?

johnl = PersonL(name:"John Appleseed --- l")
unit4Al = ApartmentL(unit:"4A")

johnl!.apartment = unit4Al
unit4Al!.tenant = johnl

johnl = nil     // 這里的johnl就可以釋放掉了
unit4Al = nil

注:PersonL實(shí)例依然保持對(duì)ApartmentL實(shí)例的強(qiáng)引用,但是ApartmentL實(shí)例只是對(duì)PersonL實(shí)例的弱引用晌区。這意味著當(dāng)你斷開johnl變量所保持的強(qiáng)引用時(shí)摩骨,再也沒有指向PersonL實(shí)例的強(qiáng)應(yīng)用了

4.無主引用

和弱引用類似,無主引用不會(huì)牢牢保持住引用的實(shí)例朗若。和弱引用不同的是恼五,無主引用是永遠(yuǎn)有值的。因此捡偏,無主引用總是被定義為非可選類型(nonoptional type)唤冈。你可以在聲明屬性或者變量時(shí),在前面加上關(guān)鍵字unowned表示這是一個(gè)無主引用银伟。

由于無主引用是非可選類型你虹,你不需要在使用它的時(shí)候?qū)⑺归_。無主引用總是可以被直接訪問彤避。不過ARC無法在市里被銷毀后將無主引用設(shè)為nil傅物,因此非可選類型的變量不允許被賦值為nil

class Customer{

    let name:String
    var card:CreditCard?
    init(name:String) {
    
        self.name = name
    }
    deinit {
        print("\(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 deinitalized")
    }
}

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

此文章代碼結(jié)果輸出

小結(jié)

代碼已上傳至git:
--> 傳送門:Swift_基本語法

附錄

查看完整專欄《Swift學(xué)習(xí)》

有問題歡迎指正以及相互探討 —— CoderSun

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市琉预,隨后出現(xiàn)的幾起案子董饰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卒暂,死亡現(xiàn)場(chǎng)離奇詭異啄栓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)也祠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門昙楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诈嘿,你說我怎么就攤上這事堪旧。” “怎么了奖亚?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵淳梦,是天一觀的道長。 經(jīng)常有香客問我昔字,道長爆袍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任作郭,我火速辦了婚禮螃宙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘所坯。我一直安慰自己谆扎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布芹助。 她就那樣靜靜地躺著堂湖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪状土。 梳的紋絲不亂的頭發(fā)上无蜂,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音蒙谓,去河邊找鬼斥季。 笑死,一個(gè)胖子當(dāng)著我的面吹牛累驮,可吹牛的內(nèi)容都是我干的酣倾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谤专,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼躁锡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起置侍,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤映之,失蹤者是張志新(化名)和其女友劉穎拦焚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杠输,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赎败,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蠢甲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟够。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖峡钓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情若河,我是刑警寧澤能岩,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站萧福,受9級(jí)特大地震影響拉鹃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲫忍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一膏燕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悟民,春花似錦坝辫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至智润,卻和暖如春及舍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窟绷。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工锯玛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兼蜈。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓攘残,卻偏偏與公主長得像,于是被迫代替她去往敵國和親为狸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肯腕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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