iOS 內存管理,ARC

iOS 對象內存釋放時機:當對象的引用計數爲0時對象被釋放函數

因此以下代碼oop

__weak NSObject * a = [[NSObject alloc] init];spa

這個對象在建立完賦完值後會被當即釋放,由於它的引用計數是0指針

 

而後說說 ARC:對象

ARC的原理是在適當的位置插入 retain,release,autorelease, 在插入 release 的地方對象的引用計數當即減一,但不必定會被釋放,由於有可能還有別的指針指向這個對象。在插入 autorelease 的地方對象的引用計數不會當即減一,而是將這個對象註冊到 autoreleasepool 中,在 autoreleasepool 釋放的時候這個對象的引用計數才被減一。在普通的 iOS 應用中,因爲是基於 runloop 的事件循環,每一個 runloop 循環都會被 autoreleasepool 包裹,因此 autorelease 的對象會在每一個 runloop 循環結束後引用計數減一(引用計數爲0的時候就被釋放)。因此說普通對象的內存釋放跟 runloop 沒有關係,引用計數爲0的話就會被釋放,只有被 autorelease 的對象的內存釋放纔跟 runloop 有關係。因此正常狀況下 ARC 不會有忘了發 release 消息這種內存泄露,只有當對象之間存在循環引用的時候,或者被無限循環的timer強引用時候纔會有內存泄露。事件

 

因此問題來了,ARC 何時會插入 autorelease?一種狀況是在有 return 語句的函數,若是這個函數不是以alloc,init開頭,而且也不包含copy,mutableCopy,那麼返回值會被autorelease,不然返回值不會被autorelease內存

相關文章
相關標籤/搜索