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.區域性變數的記憶體管理...