1. 程式人生 > >黑馬程式設計師-OC學習筆記-----記憶體管理

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

移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的.當app所佔用的記憶體較多時,系統會發出記憶體警告,這時得回收一些不需要再使用的記憶體空間。比如回收一些不需要使用的物件、變數等。基本的資料型別是放在記憶體的棧裡面,這是不需要我們去管理的,系統會自動回收。但是我們動態分配的記憶體是在記憶體的堆裡面,這些都是需要我們去管理的,每個物件都應該有著生命週期,從建立的那一刻,就應該有著它凋亡的時候。

@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
{
_age=age;
}


-(int)age
{
Return _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

方法的記憶體管理
如果你有個OC物件型別的成員變數,就必須管理這個成員變數的記憶體。
1.set方法的實現

- (void)setBook:(Book *)book{
	if (book != _book) {
		[_book release];
		_book = [book retain];
	}
}

2.dealloc方法的實現
- (void)dealloc {
	[_book release];
	[super 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學習筆記-----記憶體管理

移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的.當app所佔用的記憶體較多時,系統會發出記憶體警告,這時得回收一些不需要再使用的記憶體空間。比如回收一些不需要使用的物件、變數等。基本的資料型別是放在記憶體的棧裡面,這是不需要我們去管理的,系統會自動回收。但是

黑馬程式設計師----oc加強筆記----記憶體管理

                              引用計數器: 每個OC物件都有自己的引用計數器,是一個整數表示物件被引用的次數,即現在有多少東西在使用這個物件。物件剛被建立時,預設計數器值為1,當計數器的值變為0時,則物件銷燬。                 2)對引用計數器的操作     

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

之前我們已經提到過C語言中的記憶體儲存空間。有五大區域:堆、棧、自由儲存區、全域性\靜態儲存區和常量儲存區。 OC是以C語言為基礎的,所以也分這五大區域。 下面我們討論一下OC中記憶體管理的規律。 一、引用計數器 1.每個OC物件都有自己的引用計數器,是一個整數,即物件被

黑馬程式設計師-OC學習筆記-點方法、成員變數作用域以及set方法和get方法@property的綜合題

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.  OC建立物件的拓展: Frac

黑馬程式設計師 C#學習筆記⑥ 三層架構基礎實現員工資訊管理

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------- 三層架構定義 1、表現層(UIL):通俗講就是展現給使用者的介面,即使用者在使用一個系統的時候他的所見所得。 2、業

黑馬程式設計師_Java學習筆記之7K面試題交通等管理系統

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">

黑馬程式設計師 C#學習筆記⑤ 省市縣三級聯動查詢

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------詳細請檢視:www.itheima.com 實現一個可以動態的進行省市縣查詢的程式 一 基本原理: 通過ADO.NET技

黑馬程式設計師_學習筆記JAVA基礎總結

1、方法過載 方法覆蓋 過載:一個類中一種功能的多種實現方式,呼叫哪種實現方式,根據呼叫者給出的引數。有兩個或多個方法方法名相同,但是引數型別或者引數個數或者引數順序不同。覆蓋:子類重寫父類的一個函式,函式名,引數,返回型別都相同。 覆蓋的應用: 當子類需要父

黑馬程式設計師--JQuery學習筆記

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net

黑馬程式設計師-IOS學習筆記(二)常用關鍵字和方法

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!------- 常用關鍵字和方法: 一.記憶體管理情況 1- autorelease,當用戶的程式碼在持續執行時,自動釋放池是不會被銷燬的,這段時間內使用者可以安全地使用自動釋放的物件。當

黑馬程式設計師—C語言筆記記憶體剖析

一、進位制 1、定義:是一種計數的方式,數值的表示形式。 2、常用的4種進位制: 二進位制以0b/0B開頭如int num1 = 0b1100; 八進位制以0開頭如int num2 = 014; 十進位制如 int num3 = 12; 十六進位制以0x/0X開頭如int num4=0xc;

黑馬程式設計師 反射學習筆記

----------android培訓、java培訓、java學習型技術部落格、期待與您交流!---------- 反射:  “反射就是把Java類中的各種成分對映成相應的java類”,而在此之前,首先是必須獲得類的Class物件,再呼叫Class的相關方法,獲取例項類中

黑馬程式設計師————OC記憶體管理_筆記整理(二)

一、@Prpperty引數 // 加上retain:表示生成的set方法,release舊值,retain新值 @property (retain) Book *book; // oc物件型別 //@property (nonatomic,retain) 類名 *屬性名

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

Objective-C提供了三種記憶體管理方式: MannulReference Counting(MRC,手動管理, iOS4.1之前的版本) automatic reference counting(ARC,自動引用計數,iOS4.1 之後推出的) garbage collection(垃圾回收)。iO

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

記憶體管理 簡述 每個 oc 物件都有自己的引用計數器,是一個整數,表示”物件被引用的次數”.佔四位元組 計數器預設值為1 當為0時,物件佔用的記憶體會被系統回收. 引用的操作 給物件傳送一條 retain 計數器+1 給物件傳送一

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

1.記憶體的建立和釋放 讓我們以Object-c世界中最最簡單的申請記憶體方式展開,談談關於一個物件的生命週期。首先建立一個物件: id testObject = [[ClassName alloc] init]; //“ClassName”是任何你

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

一、記憶體管理的基本原理 1.什麼是記憶體管理 移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的,當app所佔用的記憶體較多時,系統會發出記憶體警告,這時得回收 一些不需要再使用的記憶體空間。比如回收一些不需要使用的物件、變數等。管理範圍:任何繼承了NS

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

ARC( Autom Reference Counting) 是一個編譯器特性,會自動檢測幫我們release 一、ARC基本原理 1.編譯器特性 編譯程式碼的過程中會自動檢測哪裡需要插入自動釋放記憶體的程式碼 // 新建立一個物件,會自動釋放物件 P

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

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- Objective-C對記憶體管理的方法

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

=== 記憶體管理機制 === OC的區域性變數在程式碼塊結束時被系統銷燬, 記憶體被回收. OC的物件, 內部有引用計數器, 當引用計數器的值為0時, 被系統銷燬, 記憶體被回收. 區域性變數存放在棧中. 物件存放在堆中. 注意, 物件指標還是存放在棧中, 物件本身佔用的記憶體存放在堆中. 在OC