iOS基礎之記憶體管理 一 ARC下的記憶體洩漏

2021-07-27 12:06:07 字數 1690 閱讀 2911

arc(automatic reference counting,自動引用計數)— —是指在記憶體管理中採取自動計數的技術。

**在llvm編譯器中設定arc為有效狀態,就無需再次鍵入retain或者release**** ---蘋果官方說明
換言之,滿足下面的條件就無需手動輸入retain&release了

*- 使用xcode4.2或以上版本

- 使用llvm編譯器3.0或以上版本

- 編譯器選項中設定arc為有效*

也就意味著編譯器將自動進行記憶體管理。這也是我們現在都在使用的記憶體管理方式。

那麼,在arc的記憶體管理方式下哪些情況會出現記憶體洩漏呢?

就目前我接觸到的而言,有以下2中情況:

1.互相強引用(迴圈引用)

假設乙個場景,a強引用b,b強引用a,那麼當a被其他持有者釋放的時候,b還持有他,所以他的引用計數還是1,又因為b被a持有,所以b也無法被釋放,那麼a也就無法被釋放。抱團死不了。

常見於

1)delegate的引用中,所以 delegate 通常用weak or assign.

2)block,當自己或自己強引用物件的block要自己幹活的時候,需要用__weak or __unsafe_unretained

如:

searchcontroller *search = [[searchcontroller alloc] init];

__weak typeof(search) searchw = search;

//也可以是 __unsafe_unretained searchcontroller *weakself = self;

search.searchblock = ^(nsstring *keyword, nsinteger page);

3)nstimer

我們一般要執行乙個timer的時候會用

+(nstimer *)scheduledtimerwithtimeinterval:(nstimeinterval)ti target:(id)atarget selector:(sel)aselector userinfo:(id)userinfo repeats:(bool)yesorno

這裡的atarget一般是self,這時候就需要注意了,如果在你退出的時候這個timer還在執行的話由於這個timer會持有self,所以delloc也不會呼叫。

這裡可以用兩種方式解決問題。

a.)用weakself代替self

b.)在 pop/dismiss 當前 viewcontroller 將 timer 設為 invalidate。

2.corefundation/coregraphics 相關函式

arc 針對的 objective-c 物件來說的,而 corefundation/coregraphics 這種非objective-c物件,我們一定要記得自己手動釋放,否則會造成記憶體洩漏

比如:cgbitmapcontextcreate(, , , , , , )

一定要與

cgimagerelease(cgimageref image)

成對出現。

只要記住一點:cg/cf 開頭的函式,有建立就要有釋放,這樣可以有效降低記憶體洩漏的風險。

附: 檢測記憶體洩漏的方法

iOS記憶體管理 ARC

arc是在編譯的時候插入 來確信讓物件能夠按需要來存在。arc同樣是以引用計數為基礎。你可以選擇在以檔案或者專案為單位不使用arc。但是建議盡量最好使用arc,首先,編譯器為你做記憶體管理往往比你自己要更優秀,其次,arc導致的效率損失在ui面前基本可以忽略不計。arc有以下強制規則 1.你不能顯示...

IOS基礎之 十一 記憶體管理 ARC

1.set 方法記憶體管理的相關引數 retain release舊值,retain新值 值適用於oc物件 assign 直接賦值 set方法預設,適用於非oc物件型別,即基本資料型別,也包括列舉和結構體 copy release 舊值,copy 新值 nsstring 2.是否生成set方法 re...

iOS 之記憶體管理

記憶體管理 誰建立,誰釋放,誰引用,誰管理。加號方法的實質 減號方法建立物件,然後掉用乙個autorelease,把這個建立的物件的記憶體交給系統管理。區域性變數內存在不用的時候進行釋放,全域性變數在dealloc方法中對他進行釋放。物件被釋放掉後會呼叫dealloc方法。1.區域性變數的記憶體管理...