IOS OC內存堆資源使用總結

堆內存資源不是常量靜態全局數據區,代碼區,或棧區,不會運行中保持不變或自動清理,所以需要堆內存管理技術。
堆內存管理最主要的問題是:野指針空指針crash, 內存泄露(沒有引用或者有引用導致不能重用)。
一. MRC:
1)ios 5.0之前誰擁有誰釋放,不擁有不釋放
alloc/init/new 引用計數會加1.
retain引用計數會加1.
使用完對象就要release.
@autoreleasepool是延遲清理,在調用對象調用autorelease後會塞入清理庫中(並不增刪引用計數),暫時在裏面等待,當退出作用域則對pool中所有對象調用一遍release進行清理。
OC Foudation框架的對象都是添加了autorelease的,所以用MRC時,爲了保持對象需要retain一下
@autoreleasepool在MRC和ARC中表現都一樣,只是手動autoreleasepool下MRC中需要手動添加autorelease語句。且非手動情況不會添加autoreleasepool。

2)類的變量或屬性,調用一遍retain來保持其它模塊的對象,生命週期很重要要強綁定。
再重寫父類的dealloc方法時,要調用 [superdealloc];

3)循環引用的解除,只能另外一邊release, 並用工具檢查。

二.ARC:
1)ios5以後不要調用retain, release, autorelease,retainCount,xcode會自動添加, 自動釋放時機要清楚避免性能問題。
再重寫父類的dealloc方法時,不能再調用 [super dealloc];

自動添加的autoreleasepool和手動添加的autoreleasepool區別,隱式的pool是線程消息循環runloop才處理,顯式是@autoreleasepool大括號結束或[pool drain]馬上對所有對象調用release清理一遍。
enumerateObjectsUsingBlock在遍歷裏面會自動添加@autoreleasepool{},在大循環中可以提升性能,當然也可以在for/forin中手動添加@autoreleasepool{}馬上清理產生的大量堆垃圾。

2)類的成員變量和屬性要用強弱指針(子類,或代理類使用弱指針),保證賦值的指針所指向對象不被清理(默認指針都是強指針所以不用擔心),也可以用強綁定來綁定聲明週期。
屬性默認不是strong類型,默認特性是 unsafe_unretained 相當於assign,被釋放後會變成野指針,因此需要
@property(strong, nonatomic) NSMutableArray *birdNames;來保持,否則引用賦值給它,後面會導致crash。

3)循環引用問題,一方爲弱指針或賦值爲nil(賦值爲nil時候解除了強引用會調用一次release, 隱式autoreleasepool中下次消息循環調用清理庫),代碼進行判空來解除該問題。

reference:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章