MRC ARC 記憶體洩露 記憶體管理

2021-08-08 13:30:21 字數 2353 閱讀 3304

什麼是記憶體管理?????

換句話就是對記憶體位址的操作。程式在執行的過程中通常以下行為,都會使程式占用記憶體。

1. 建立乙個oc物件

2.定義乙個變數

3.呼叫乙個函式或者方法

通常我們買手機都要關注下,手機的記憶體、執行記憶體等引數,那是因為我們手機的記憶體是一定的,超出手機記憶體,會導致手機崩潰,宕機等狀況。平時我們玩手機都是開著多個軟體,所以需要對軟體的占用記憶體進行管理。

程式中占用的記憶體超出,系統會發出警告,這時需要程式對現在暫時不需要的記憶體空間(不使用的物件、變數)**。

so    對記憶體

進行合理的分配記憶體、清除記憶體、**沒有使用的物件,保證程式的穩定性。

開發工程中,那些才需要我們進行記憶體管理?????

一、任何繼承了nsobject的物件需要進行記憶體管理

二、其他非物件型別(int  char   float  double  struct  enum等)不需要手動記憶體管理

作業系統的記憶體是堆   和   棧兩種形式

堆一般是程式設計師分配和釋放的記憶體位址空間----手動記憶體管理mrc

棧是系統自動分配和釋放的記憶體位址空間----自動管理記憶體arc

記憶體的管理原則,誰分配,誰管理(釋放)

arc我們一般不做任何操作

mrc需要我們管理,管理得有個標準(參考)。

mrc通過引用計數器來判斷這個物件是處於使用狀態,還是處於釋放狀態。

當物件剛建立時,引用計數為1

使用一次alloc、new、copy建立物件時,引用計數為1

當沒有人使用這個物件時,系統**這個物件,從引用計數判斷,引用計數為0,改物件占用的記憶體會被系統**。

引用計數器的操作

為保證物件的存在,需要對物件傳送(呼叫)一條retain(返回物件本身)訊息,引用計數+1

不在使用物件時,通過傳送(呼叫)release訊息,引用計數  -1

物件通過呼叫(傳送)retaincount訊息    獲得該物件當前引用計數

當前引用計數 =0,系統自己會釋放記憶體,自動傳送(呼叫)dealloc訊息   這是銷毀/**物件  需要注意下release只是對引用計數的操作,對物件沒有任何作用,不是它銷毀物件的

另外注意下,物件傳送dealloc訊息時,必須呼叫super  dealloc,還用就是該物件的記憶體位址進行其他操作,強行操作會使程式崩潰,該記憶體位址也成為野指標。

野指標和空指標

只用物件被釋放,我們這個物件為殭屍物件(不能使用物件)

當乙個指標指著乙個殭屍物件,我們稱這個指標為野指標

只要野指標傳送訊息就會報錯(程式崩潰)

避免出現野指標,給該物件置空。

自動釋放池(自動管理 除了這池,這池裡的物件全部釋放,**空間)

autorelease是一種支援引用因數的記憶體管理方式,只要物件傳送autorelease訊息,該物件就會放在乙個自動釋放池中,當自動釋放池被銷毀時,池中小魚(物件)全部清洗掉。特殊情況如果小魚引用計數-1 之後,引用計數不為0,這個小魚學了分身術,不會被釋放

自動釋放池的特別之處:不需要關心物件釋放的時間,不用關心什麼時候呼叫release

autorelease本質還是物件呼叫release方法(延遲),只是有個標記,池的標記,在池內,物件一直存在,在池外就沒用這個標記,就是釋放

注意事項

並不是放到自動釋放池中,該物件就要遵守自動釋放池準則,需要該物件傳送autorelease訊息

自動釋放池外面傳送autorelease訊息,不起任何作用

自動釋放池中不適合放占用記憶體比較大的物件

大量迴圈操作放到同乙個autoreleasepool中,會造成記憶體峰值的上公升

不能連續使用autorelease  

使用了autorelease     release  兩個不能連續使用

mrc避免使用死迴圈

定義兩個類person類和dog類

#import @class dog;

@inte***ce person : nsobject

@property(nonatomic, retain)dog *dog;

@end

#import @class person;

@inte***ce dog : nsobject

@property(nonatomic, retain)person *owner;

@end

執行以下**:

int main(int argc, const char * argv)
就會出現a物件要擁有b物件,而b對應又要擁有a物件,此時會形成迴圈retain,導致a物件和b物件永遠無法釋放

那麼如何解決這個問題呢?

MRC ARC 記憶體管理 雜記

簡述基本原則 1.之前 oc記憶體管理遵循 誰建立 誰釋放,誰引用 誰管理 的機制,當建立或引用乙個物件的時候,需要向其傳送alloc copy retain訊息,當釋放該物件是需要傳送release訊息,當物件引用計數為0時,系統將釋放該物件,這是oc的手動管理機制 mrc 2.目前 ios5.0...

MRC ARC記憶體管理機制

mrc下,oc記憶體管理遵循 誰建立 誰釋放 誰引用 誰管理 的機制,當建立或引用乙個物件時,需要向她傳送alloc,copy,retain訊息,當釋放該物件時需要傳送release訊息,當引用計數為零的時候,系統釋放該物件。arc是自動引用計數,管理機制與手動機制一樣,只是不再需要呼叫retain...

如何管理記憶體洩露

內容很簡單,感覺用的話可以下。釋放超出範圍 忘記釋放 void testfuc 或者 testclass void foo 3.錯誤的使用new delete double d new double 12 delete d delete d 0 必須使用delete d 4.錯誤釋放 int i w...