Swift中的weak和unowned關鍵字

2021-08-21 05:19:44 字數 1675 閱讀 3959

swift中沒有了strong,assign,copy關鍵字,對於所有的class型別變數都預設採用了strong型別,如果需要指定使用weak,則需要新增weak關鍵字修飾。

正是由於這種預設的strong型別,在閉包中會引起迴圈引用,導致記憶體無法釋放,為了能夠在閉包(block)中正常釋放記憶體,需要對閉包中的self使用弱引用,也就是不持有self物件。

如下面的**中:

class userinfoviewcontroller  else 

}}()

// ...

}

按照上面的**寫的話,就會引入迴圈引用。因為self(也就是userinfoviewcontroller的例項物件)持有updateinfoblock,而updateinfoblock又反過來持有物件self,這將會導致兩者的記憶體都無法釋放。

這個時候,我們可以在updateinfoblock中使用關鍵字weakself進行修飾,避免迴圈引用的產生。

**如下:

class userinfoviewcontroller  else 

}}()

// ...

}

這樣,我們就可以避免迴圈引用了。但是我們注意到,在閉包內,self變成了optional型別,這是因為weak修飾的物件在外界有可能釋放,釋放後就變成了nil,所以這裡要用optional

針對這個例子,我們知道,在updateinfoblock的有效期內,self是不可能釋放的,因為self釋放需要先釋放updateinfoblock,在這種情況下,我們可以使用unowned代替weak關鍵字,這樣的話,閉包內的self物件仍舊是原來的型別,可以直接使用。

**如下:

class userinfoviewcontroller  else 

}}()

// ...

}

只有當weak修飾的物件(self)本身對當前物件(updateinfoblock)有強引用,也就是持有當前物件時,才可以把weak替換為unowned,因為unowned修飾的物件在釋放後將會變成野指標,導致應用crash。所以只有能夠確保修飾的物件(self)不會先於當前物件(updateinfoblock)釋放時,才可以使用unowned關鍵字。

Swift 記憶體管理,WEAK 和 UNOWNED

不管在什麼語言裡,記憶體管理的內容都很重要,所以我打算花上比其他 tip 長一些的篇幅仔細地說說這塊內容。swift 是自動管理記憶體的,這也就是說,我們不再需要操心記憶體的申請和分配。當我們通過初始化建立乙個物件時,swift 會替我們管理和分配記憶體。而釋放的原則遵循了自動引用計數 arc 的規...

14 6 Swift中weak解決迴圈強引用

6 迴圈強引用 arc不是萬能的,它可以很好的解決記憶體過早釋放的問題,但是在某些場合下不能很好的解決記憶體洩漏的問題。迴圈強引用是造成記憶體洩漏的原因。接下來我們還是用 來給大家講解什麼是迴圈強引用。直接用官方例子 class person varapartment apartment?deini...

weak和assign的區別

工作之後,一直使用arc,weak作為property的關鍵字之一,代表弱引用,物件的引用計數不改變。從記憶體管理上說這點和assign是相同的。倆者的不同在於 1.weak 此特質表明該屬性定義了一種 非擁有關係 nonowning relationship 為這種屬性設定新值時,設定方法既不保留...