swift中沒有了strong
,assign
,copy
關鍵字,對於所有的class
型別變數都預設採用了strong
型別,如果需要指定使用weak
,則需要新增weak
關鍵字修飾。
正是由於這種預設的strong
型別,在閉包中會引起迴圈引用,導致記憶體無法釋放,為了能夠在閉包(block
)中正常釋放記憶體,需要對閉包中的self
使用弱引用,也就是不持有self
物件。
如下面的**中:
class userinfoviewcontroller else
}}()
// ...
}
按照上面的**寫的話,就會引入迴圈引用。因為self
(也就是userinfoviewcontroller
的例項物件)持有updateinfoblock
,而updateinfoblock
又反過來持有物件self
,這將會導致兩者的記憶體都無法釋放。
這個時候,我們可以在updateinfoblock
中使用關鍵字weak
對self
進行修飾,避免迴圈引用的產生。
**如下:
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 為這種屬性設定新值時,設定方法既不保留...