什麼是記憶體管理?????
換句話就是對記憶體位址的操作。程式在執行的過程中通常以下行為,都會使程式占用記憶體。
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...