讀書筆記之 weak修飾詞

2021-07-14 01:46:35 字數 1604 閱讀 7722

二、 _weak修飾詞

因為使用_strong修飾詞,易出現迴圈引用,使用_weak來解決。

(1)迴圈引用的例子--在類中成員變數可能出現的迴圈引用

@inte***ce test : nsobject

(void)setobject:(id __strong)obj;

@end

@implementation test

- (id)init


(void)setobject:(id __strong)obj

@end

下面這段**將產生迴圈引用

控制流出了這段**區域時,變數test0對a的強引用消失,物件a被自動釋放。類似的物件b也被自動釋放。但是物件a的成員變數obj_ 還強引用物件b,從而記憶體洩漏

解決方法

(2)self reference造成的迴圈引用

什麼是』self reference』

物件對自己的引用簡稱』self reference』

例子 id test = [[test alloc] init];

避免』self reference』--使用_weak屬性修飾詞

_weak修飾詞提供乙個弱引用,使用_weak可以避免迴圈引用。

id _weak obj = [[nsobject alloc] init];

上面**編譯後會出現警告:warning: assigning retained obj to weak variable; obj will be released after assignment [-warc-unsafe-retained-assign]

//離開此區域,物件的強引用消失,物件被自動釋放。因為弱引用對物件沒有擁有權。

當乙個被weak修飾的變數對乙個物件有乙個引用,並且這個物件消失時,這個弱引用也就自動消失。這意味著變數被分配為nil。
id __weak obj1 = nil;

nslog(@」b: %@」, obj1);

the result is:

a: b: (null)

(3)什麼是記憶體洩漏

記憶體洩漏指一些被認為釋放的物件仍保留在記憶體中,迴圈引用常造成記憶體洩漏

C語言修飾詞之const

const是乙個c語言的關鍵字,它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性,另外,在 別人 的時候,清晰理解const所起的作用,對理解對方的程式也有一些幫助。另外const在其他程式語言中也有出現,如c php5 c net hc08 c。c中const的使...

C語言修飾詞之violate

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值 from memory 而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子 1 並行裝置的硬體暫存器 ...

C語言修飾詞之violate

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值 from memory 而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子 1 並行裝置的硬體暫存器 ...