1.什麼是記憶體管理
一旦test方法執行完畢,意味著區域性變數的作用域也失效,那麼棧空間的區域性變數系統會自動檢測**。但是堆空間中動態產生的物件是還沒有被**。如圖
可以看出即使已經沒有指標指向動態產生的物件了,但還是沒有被**,因此需要手動管理釋放。釋放的方法是為物件傳送一條訊息。因此需要呼叫物件的某個方法來釋放物件。
2.物件結構
每個oc物件內部都有自己的引用計數器,它是乙個整數,表示"物件被引用的次數",即有多少人正在使用這個oc物件 每個oc物件內部會自動設定4個位元組的儲存空間來儲存引用計數器
3.引用計數器的作用
當使用alloc、new或者copy建立乙個新物件時,新物件的
引用計數器
預設就是1 當乙個物件的引用計數器值為0時,物件占用的記憶體就會被系統**。換句話說,如果物件的計數器不為0,那麼在整個程式執行過程,它占用的記憶體就不可能被**,除非整個程式已經退出
4.操作物件引用計數器的方法
給物件傳送一條retain訊息,可以使引用計數器值
+1(retain方法返回物件本身)retain方法返回的是id型別,那麼哪個物件呼叫返回的就是自己 給物件傳送一條release訊息,可以使引用計數器值
-1可以給物件傳送retaincount訊息獲得當前的引用計數器值
5.物件的銷毀
當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統** 當乙個物件被銷毀時,系統會自動向物件傳送一條dealloc訊息 一般會重寫dealloc方法,在這裡釋放相關資源,dealloc就像物件的遺言 一旦重寫了dealloc方法,就必須呼叫[super dealloc],並且放在最後面呼叫
不能直接呼叫
dealloc
方法一旦物件被**了,它占用的記憶體就不再可用,堅持使用會導致程式崩潰(野指標錯誤)
view source
print?
01.
// alloc方法是給堆中分配記憶體 init方法和記憶體無關 此時retaincurrent為1
02.
person *p = [[person alloc] init];
03.
04.
// 返回的就是物件本身 retaincurrent為2
05.
[p retain];
06.
07.
// retaincurrent為1
08.
[p release];
09.
10.
// retaincurrent為0 說明person類物件被**,那麼對應的在記憶體中的位址已經不可用了 此時的person物件稱為「殭屍物件」但是此時p指標還是在指向person類物件所對應的那塊不可用的位址此時的p指標稱為「野指標」
11.
[p release];
6.開發中要注意的記憶體管理
預設情況下,xcode是不會管理殭屍物件的,即使使用了一塊被釋放的記憶體也不會報錯。為了方便除錯,應該開啟殭屍物件監控。如圖設定:
注意三個概念:
殭屍物件:已經被**的物件,或者說物件所對應的記憶體位址已經不可用的物件稱為殭屍物件。殭屍物件不可用
野指標:指向一塊不可用記憶體位址或者指向殭屍物件的指標稱為野指標。給野指標傳送訊息會報 exc_bad_access錯誤
空指標:沒有指向任何指標變數稱為空指標,也意味著指標變數所儲存的值為0,nil,null 這樣可以避免野指標錯誤的發生
view source
print?
01.
/********************************** person.h **************************************/
02.
#
import
03.
04.
@inte***ce
person : nsobject
05.
06.
@property
int
age;
07.
08.
@end
09.
10.
11.
/********************************** person.m **************************************/
12.
#
import
"person.h"
13.
14.
@implementation
person
15.
16.
// 重寫父類nsojbct的遺言方法 物件在被釋放之前一定會呼叫dealloc方法
17.
18.
- (
void
)dealloc
19.
24.
@end
25.
26.
27.
/********************************** main.m **************************************/
28.
#
import
29.
#
import
"person.h"
30.
31.
32.
/*
33.
main方法是乙個死迴圈方法以保證程式能持續執行,除非使用者關閉程式或者是手機沒電,程式才能終止
34.
那麼在main方法裡面的person物件不就一直存在麼,因此必須在main方法裡面將物件**
35.
*/
36.
int
main(
int
argc,
const
char
* argv)
37.
tinyxml非常好的例項
這個例子對於只想簡單使用xml的使用者來說,非常有學習價值。完整程式 相信具有基本c 知識的人可以明白的 xml檔案內容 xml version 1.0 encoding gb2312 standalone yes resumes num 2 resume name 裕作 gender 男 gend...
排序總結(總結的非常好)
前幾天應乙個朋友的要求,幫他完成了資料排序的乙個作業。覺得很有給大家參考的價值,所以經過他同意,作了些修改帖了上來。源 見附件,中實現了8種排序演算法,各演算法名稱見下表或見原始碼。執行程式時,將需要你輸入一數值,以確定對多少隨機數進行排序。然後將會顯示各排序演算法的耗時。並且你可選擇時否進行正序和...
有句話說的非常好
愷英總裁大學畢業前,賺了幾百萬,做的就是做 掛流量。他說他做了非常多的站,主要還是因為興趣,他做的都是他自己非常喜歡做的事情。愷英王悅說 人一定要做自己感興趣的事情,這樣就會充滿激情,不會感到疲憊 後來有位技術出身的老總,說了一句話,我剛好在 小狗錢錢 上看到了,感觸非常的深 每天要做一些超出自己能...