黑馬程式設計師 OC學習筆記 記憶體管理

2021-06-29 03:24:58 字數 3289 閱讀 4243

@property和@synthesize關鍵字

@property和@synthesize關鍵字可以幫助我們構造屬性的設定和訪問方法即setter和getter方法,可以省去我們很多重複機械的**。

在宣告檔案中使用 @property 宣告變數,在實現檔案中用@synthesize 

@property 關鍵字可以自動生成某個成員變數的setter和getter方法的宣告

@property int age;
編譯時遇到這一行,則自動擴充套件成下面兩句:

- (void)setage:(int)age;

- (int)age;

@synthesize關鍵字幫助生成成員變數的setter和getter方法的實現。

@synthesize age=_age;
相當於下面的**:

-(void)setage:(int)age

-(int)age

在新的版本裡面@synthesize被拋棄不用了,只要在宣告檔案裡面使用@property宣告了變數,那麼在實現檔案中就不需要用@synthesize了,也能夠生成屬性的getter和setter方法的實現。

@property關鍵字的引數介紹

1.控制set方法的記憶體管理

retain : release舊值,retain新值(用於oc物件)

assign : 直接賦值,不做任何記憶體管理(預設,用於非oc物件型別)

copy   : release舊值,copy新值(一般用於nsstring *)注:物件進行深拷貝,原來的物件進行release操作

2.控制需不需生成set方法

readwrite :同時生成set方法和get方法(預設)

readonly  :只會生成get方法

3.多執行緒管理

atomic:效能低(預設)

nonatomic :效能高(一般會使用此引數)

4.控制set方法和get方法的名稱

setter : 設定set方法的名稱,一定有個冒號:

getter : 設定get方法的名稱

不同型別的引數可以同時使用,同型別的只能使用乙個

宣告property的語法為:@property (引數1,引數2) 型別 名字

@property (nonatomic,retain) person *p;
計數器的引入每個oc物件都有自己的引用計數器,是乙個整數,表示「物件被引用的次數」,即有多少人正在使用這個oc物件

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

物件的結構圖:

計數器的作用

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

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

計數器的操作

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

給物件傳送一條release訊息,可以使引用計數器值-1

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

物件的銷毀

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

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

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

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

不要直接呼叫dealloc方法

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

記憶體管理法則

誰建立,誰release

如果你通過alloc、new或[mutable]copy來建立乙個物件,那麼你必須呼叫release或autorelease

換句話說,不是你建立的,就不用你去[auto]release

誰retain,誰release

只要你呼叫了retain,無論這個物件是如何生成的,你都要呼叫release

方法的記憶體管理

- (void)setbook:(book *)book

}

2.dealloc方法的實現

- (void)dealloc
若在成員變數宣告的時候使用了retain引數就不需要寫setter方法了。

例如:

@property (nonatomic,retain) book *book;

迴圈引用

當a、b類相互引用時,會佔據著物件讓兩個物件都無法得到釋放。而且直接兩個標頭檔案中相互包含編譯器會報錯的。

在標頭檔案裡面使用@class 來宣告a、b是類,在實現檔案裡面用到了哪個就匯入其標頭檔案。

解決記憶體佔據不釋放的方法:@property關鍵字一段用retain 另外一端用 assign

autoreleasepool 和autorelease

autoreleasepool 

自動釋放池,管理池子中的物件

autorelease

給物件傳送autorelease訊息時,會將物件存入autoreleasepool,當系統執行完自動釋放池時,自動釋放池會自動清空池子裡邊的物件

【注】自動釋放池類似於乙個陣列,進行延遲釋放,不會馬上計數器減一,而是將當前物件放入最近的自動釋放池中,當釋放池釋放的時候將池中每乙個元素都釋放一次

自動釋放池有著諸多的限制,記憶體開銷過大的不宜使用,但它的存在讓我們可以不用怎麼太過於注意物件的release時間。

person *p = [[[person alloc] init] autorelease];

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

1.什麼是記憶體管理 管理範圍 任何繼承了nsobject的物件,對其他基本型別無效 2.物件的基本結構 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少個人正在使用oc物件 每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器 3.引用計數器的作用 當使用all...

黑馬程式設計師 oc加強學習(記憶體管理)

記憶體管理的原則 1 如果物件有人在使用,那麼就不應該 如果你想使用這個物件,就應該讓這個物件retain一次。如果你不想用這個物件了,就應該讓這個物件release一次。2 誰建立 誰release 哪個物件建立了空間,那個物件就release 3 誰retain 誰release 哪個物件的空間...

黑馬程式設計師學習筆記 OC之記憶體管理 2

黑馬程式設計師學習筆記 oc記憶體管理2 1 迴圈引用 對於迴圈依賴關係來說,比方a類引用b類,同時b類也引用a類這種 編譯會報錯。2 class 當使用 class在兩個類相互宣告,就不會出現編譯報錯,使用 class 類名 就可以引用乙個類,說明一下它是乙個類。3 和 import 的區別1 i...