autorelease方法不會改變物件的引用計數器,只是將這個物件放到自動釋放池中;
自動釋放池實質是當自動釋放池銷毀後呼叫物件的release方法,不一定就能銷毀物件(例如如果乙個物件的引用計數器》1則此時就無法銷毀);
由於自動釋放池最後統一銷毀物件,因此如果乙個操作比較占用記憶體(物件比較多或者物件占用資源比較多),最好不要放到自動釋放池或者考慮放到多個自動釋放池;
objc中類庫中的靜態方法一般都不需要手動釋放,內部已經呼叫了autorelease方法;
是因為物件和其他資料型別在系統中的儲存空間不一樣,其它區域性變數主要存放於棧中,而物件儲存於堆中,當**塊結束時這個**塊中涉及的所有區域性變數會被**,指向物件的指標也被**,此時物件已經沒有指標指向,但依然存在於記憶體中,造成記憶體洩露。在每個oc物件內部,都專門有4個位元組的儲存空間來儲存引用計數器
////
- (void)setcar :(car *)car
}//////////////
dealloc方法的**規範
(1)一定要[super dealloc],而且要放到最後
(2)對self(當前)所擁有的的其他物件做一次release操作
dealloc 也是用來釋放資源的 ,跟viewdidunload的關係:
當發出記憶體警告呼叫viewdidunload方法時,只是釋放了view,並沒有釋放uiviewcontroller。所以並不會呼叫dealloc方法。即viewdidunload和dealloc方法並沒有任何關係,dealloc方法只會在uiviewcontroller不被釋放的時候呼叫。
記憶體管理相關引數
retain:對物件release舊值,retain新值(適用於oc物件型別)
assign:直接賦值(預設,適用於非oc物件型別)
copy:release舊值,copy新值
OC 記憶體洩露 自動釋放池
花絮 看到下面的 就想起這麼乙個調侃 乙個老程式設計師,功成名就,金盆洗手不在寫 後,決定練練書法。提筆思索良久後在紙上寫下 hello world 1 首先說下自動釋放池的底層實現 它是通過以 autoreleasepoolpage 為結點的雙向鍊錶來實現的。很類似棧的方式 對應push操作 底層...
釋放記憶體總結
1.用new malloc顯式分配在堆上的記憶體才需要用delete free釋放,而在棧上分配的如int array 80 在子程式結束時自動釋放,分配與釋放都和資料型別無關。2.delete乙個指標的時候 一定要檢查是否為null,否則是個嚴重的應用程式錯誤.3.釋放乙個陣列要用delete 4...
c c 記憶體釋放知識總結
基礎知識 五大記憶體分割槽 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在...