非常好的ios記憶體基礎知識

2021-06-25 13:20:26 字數 4321 閱讀 6989

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***ceperson : nsobject

05.

06.@propertyintage;

07.

08.@end

09.

10.

11./********************************** person.m **************************************/

12.#import"person.h"

13.

14.@implementationperson

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.intmain(intargc,constchar* argv)

37.

tinyxml非常好的例項

這個例子對於只想簡單使用xml的使用者來說,非常有學習價值。完整程式 相信具有基本c 知識的人可以明白的 xml檔案內容 xml version 1.0 encoding gb2312 standalone yes resumes num 2 resume name 裕作 gender 男 gend...

排序總結(總結的非常好)

前幾天應乙個朋友的要求,幫他完成了資料排序的乙個作業。覺得很有給大家參考的價值,所以經過他同意,作了些修改帖了上來。源 見附件,中實現了8種排序演算法,各演算法名稱見下表或見原始碼。執行程式時,將需要你輸入一數值,以確定對多少隨機數進行排序。然後將會顯示各排序演算法的耗時。並且你可選擇時否進行正序和...

有句話說的非常好

愷英總裁大學畢業前,賺了幾百萬,做的就是做 掛流量。他說他做了非常多的站,主要還是因為興趣,他做的都是他自己非常喜歡做的事情。愷英王悅說 人一定要做自己感興趣的事情,這樣就會充滿激情,不會感到疲憊 後來有位技術出身的老總,說了一句話,我剛好在 小狗錢錢 上看到了,感觸非常的深 每天要做一些超出自己能...