本文主在記錄內(nèi)存管理方面的關(guān)鍵概念,文中涉及均查自網(wǎng)絡(luò)資料美浦,如有不對的地方尽棕,歡迎指正!
環(huán)境:iOS Xcode
內(nèi)存管理的四條規(guī)則
OC對象的動(dòng)作 | OC對象的方法 | retainCount |
---|---|---|
1.創(chuàng)建1個(gè)對象并獲取它的所有權(quán) | alloc/new/copy/mutableCopy | RC=1 |
2.獲取對象所有權(quán) | retain | RC+1 |
3.放棄對象所有權(quán) | release | RC-1 |
4.釋放對象 | dealloc | RC=0(此時(shí)自動(dòng)調(diào)用dealloc) |
所有權(quán)修飾符
__strong
- 如果某個(gè)變量var被__strong修飾味赃,當(dāng)變量var指向某個(gè)對象obj時(shí)掀抹,那么變量var就持有對象obj的所有權(quán);
- 如果某個(gè)變量var放棄對象的所有權(quán):即release,當(dāng)變量超過它的作用域、var被重新賦值或成員變量被丟棄時(shí)實(shí)現(xiàn)心俗;
注:釋放對象傲武,即dealloc,當(dāng)該對象的RC=0時(shí)城榛,系統(tǒng)將來某個(gè)時(shí)刻(自動(dòng)釋放池觸發(fā)時(shí))自動(dòng)調(diào)用對象所屬類的dealloc方法揪利。
__weak
- 被__weak修飾的變量var,var都不持有對象obj的所有權(quán)狠持,即不會引起obj的RC變化疟位;
- 當(dāng)var指向的對象RC=0被釋放時(shí),變量會自動(dòng)置為nil;
注:針對循環(huán)引用問題可以使用__weak解決
__unsafe_unretained 或 assign
- 和__weak類似喘垂,被__unsafe_unretained修飾的變量var不持有對象obj的所有權(quán)甜刻,即obj的RC不變绍撞;
- 不同于__weak,RC=0對象被釋放時(shí),使用__unsafe_unretained修飾的變量指針不自動(dòng)置為nil;
注:對象釋放后得院,使用__unsafe_unretained修飾的變量傻铣,指針不自動(dòng)置為nil,此時(shí)再訪問該對象,該對象已經(jīng)不存在會造成非法訪問(Invalid Access),即:野指針崩潰祥绞。
__autoreleasing
- 加入自動(dòng)釋放池矾柜,由編譯器隱式實(shí)現(xiàn)。
屬性修飾詞
ARC下屬性修飾詞和所有權(quán)修飾符對應(yīng)關(guān)系如下:
屬性修飾詞(property modifer) | 所有權(quán)修飾符(owership qualifer) |
---|---|
strong | __strong |
retain | __strong |
copy | __strong |
weak | __weak |
assign | __unsafe_unretained |
unsafe_unretained | __unsafe_unretained |