黑馬程式設計師 IOS基礎之OC記憶體管理

2021-07-04 03:19:56 字數 2474 閱讀 7460

記憶體管理

01、為什麼要記憶體管理?

記憶體管理可謂是oc裡面最重要的環節,因為早前開發ios程式的,在網上沒有學習資源,就去買相關的書籍,自己就去摸索,當時只注重功能的實現,沒有重視記憶體管理,所以那時候的好多開發者都在記憶體管理上吃了不少虧。開發者如果不重視記憶體管理,在寫**的過程中,就會發現寫一行就報乙個錯,寫一行又報乙個錯,但是編譯器和鏈結器是不會報錯的(只要語法沒有問題),所以就是記憶體沒有管理好,記憶體洩露了。

那麼什麼是記憶體管理呢?我們一款移動裝置的記憶體是極其有限的,如iphone4或iphone4s的記憶體只有512兆,既然只有這麼一點記憶體,那我們每乙個應用程式所佔的記憶體就得限制一下(乙個應用程式預設的記憶體就只有幾十兆),一旦你的應用程式占用的記憶體超過了這幾十兆,系統就會給應用程式發出記憶體警告。此時,你接收到系統發出的記憶體警告,你應該盡量的**那些你不使用的物件,如果還占用這些記憶體空間,應用程式可能就會強制退出。

記憶體管理如圖:

棧記憶體中的變數,系統都會自動**,而堆中person物件只有當程式結束後,才會**。

總結

02、引用計數器

接上面的例子,儘管我們棧中沒有指標指向我們的person物件,所以我們的person物件就會一直占用我們的記憶體空間。那麼我們怎麼知道person物件什麼時候**呢?

1、每個oc物件都有自己的引用計數器,是乙個整數,表示「物件被引用的次數」。即有多少人正在使用這個oc物件。

2、每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器。

引用計數器的作用

1、當使用alloc、new或者copy建立乙個新物件是,新物件的引用計數器預設就是1

2、當乙個物件的引用計數器值為0時,物件占用的記憶體就會被系統**。換句話說,如果物件的計數器不為0,那麼在整個程式執行過程中,它占用的記憶體就不可能被**,除非整個程式已經退出。

引用技術全球的操作

1、給物件傳送一條retain訊息,可以使引用計數器值+1(retain方法返回物件本身)。

2、給物件傳送乙個release訊息,可以使引用計數器值-1。

3、可以給物件傳送retaincount訊息,可以獲得當前的引用計數器的值。

物件的銷毀

1、當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統**。

2、當乙個物件被銷毀時,系統會自動向物件傳送一條dealloc訊息。

3、一般會重寫dealloc方法,在這裡釋放相關資源,dealloc就像物件的遺言。

4、一旦重寫了dealloc方法,就必須呼叫[super dealloc],並且放在最後面呼叫。

5、不要直接呼叫dealloc方法。

6、一旦物件被**了,它占用的記憶體就不再可用,堅持使用會導致程式崩潰(野指標錯誤)。

**如下:

person類檔案

@inte***ce person : nsobject

- (void)setage:(int)age;

- (int)age;

@end

#import @implementation person

- (void)setage:(int)age;

- (int)age

//當乙個person物件被**的時候,就會自動呼叫這個方法。

- (void) dealloc

@end

main.m檔案中

#import #import "person.h"

int main()

其他,物件被**有兩種方式,第一種,就是程式在執行的過程中我們程式設計師手動的**,第二種就是程式結束後,將**所有的記憶體。那麼我們來驗證一下,物件是否被**。我們知道物件被**的時候,會呼叫自己的dealloc方法,所以我們重寫物件的dealloc方法,來驗證我們物件是否被**。

所以,只要是有alloc,就要有release,只要有retain,就要有release。

總結:1、方法的基本使用

1> retain:計數器+1,會返回物件本身。

2> release:計數器-1,沒有返回值。

3> retaincount:獲取當前的計數器。

4> dealloc:當乙個物件要被**的時候,就會呼叫,一定要放在最後面呼叫[super dealloc]。

2、概念

1> 殭屍物件:所占用記憶體已經被**的物件,殭屍物件不能使用。

2> 野指標:指向殭屍物件(不可用記憶體)的指標。

3> 空指標:沒有指向任何東西的指標(儲存的東西是nil、null、0)

給空指標傳送訊息不會報錯。

黑馬程式設計師 OC基礎 記憶體管理

oc的區域性變數在 塊結束時被系統銷毀,記憶體被 oc的物件,內部有引用計數器,當引用計數器的值為0時,被系統銷毀,記憶體被 區域性變數存放在棧中.物件存放在堆中.注意,物件指標還是存放在棧中,物件本身占用的記憶體存放在堆中.在oc中,我們要對自己寫的繼承了nsobject的物件進行記憶體管理.物件...

黑馬程式設計師 OC基礎

asp.net unity開發 net培訓 期待與您交流!1.import的用途 1 跟 include一樣,拷貝檔案的內容 2 可以自動防止檔案的內容被重複拷貝 2.import nsobjcruntime.h中有nslog函式的宣告,一般用 3.foundation框架標頭檔案的路徑 4.主標頭...

黑馬程式設計師 iOS開發之OC之記憶體管理

1 retain 1 2 release 1 3 retaincount 獲得計數器 1 set方法的實現 void setcar car car 2 dealloc方法的實現 不要直接呼叫dealloc,系統自動呼叫 void dealloc 1 oc物件型別 property nonatomic...