ARC與MRC的區別

2021-10-01 18:17:08 字數 619 閱讀 1367

主要是編譯時和執行時兩個方面:

arc在編譯時做了哪些工作?

根據**執行的上下文語境,在適當的位置插入 retain,release

arc在執行時做了哪些工作?

主要是指 weak 關鍵字。weak 修飾的變數能夠在引用計數為0 時被自動設定成 nil,顯然是有執行時邏輯在工作的。

為了保證向後相容性,arc 在執行時檢測到類函式中的 autorelease 後緊跟其後 retain,此時不直接呼叫物件的 autorelease 方法,而是改為呼叫 objc_autoreleasereturnvalue。 objc_autoreleasereturnvalue 會檢視當前方法返回之後即將要執行的那段**,若那段**要在返回物件上執行 retain 操作,則設定全域性資料結構中的乙個標誌位,而不執行 autorelease 操作,與之相似,如果方法返回了乙個自動釋放的物件,而呼叫方法的**要保留此物件,那麼此時不直接執行 retain ,而是改為執行 objc_retainaoutoreleasedreturnvalue函式。此函式要檢測剛才提到的標誌位,若已經置位,則不執行 retain 操作,設定並檢測標誌位,要比呼叫 autorelease 和retain 更快。

ARC與MRC的混編

ios5.0以後就開始可以使用arc automatic reference counting 自動引用計數 來代替之前的mrc manual reference counting 人工引用計數 使用arc會減少很多 和忘了釋放物件的苦惱。但是事情都有兩面性。使用了arc之後如果你想復用以前寫過的使...

block 的ARC和MRC中的區別

block屬性的宣告,首先需要用copy修飾符,因為只有copy後的block才會在堆中,棧中的block的生命週期是和棧繫結的,可以參考之前的文章 ios 非arc下返回block 另乙個需要注意的問題是關於執行緒安全,在宣告block屬性時需要確認 在呼叫block時另乙個執行緒有沒有可能去修改...

block在ARC和MRC中的區別

block在arc和mrc中的宣告引用有些區別.block可以儲存在棧中,也可以在堆中 預設儲存在棧中,不需要管理記憶體 儲存在堆中的block會對block進行retain操作 mrc block在堆中時,不想對block進行retain操作,前面加 block arc 前面加 weak或 uns...