1. 程式人生 > >黑馬程式設計師——OC的記憶體管理

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

1.記憶體的建立和釋放

讓我們以Object-c世界中最最簡單的申請記憶體方式展開,談談關於一個物件的生命週期。首先建立一個物件:

id testObject = [[ClassName alloc] init];
//“ClassName”是任何你想寫的類名,比如NSString  NSArray等一切隨意

注: alloc 是object-c 中常用來申請記憶體塊的方式
此時,對於物件“testObject”來說,他的引用計數就是1了,原因就是他呼叫了alloc來建立了一塊只屬於他的記憶體,這樣物件的引用計數就得+1. 另外,Object-c中的另兩個關鍵字retaincopy也會將物件的引用計數+1.根據Object-c的記憶體管理機制,我們在使用完“testObject”後,需要釋放它。

[testObject release];

release後的物件,雖然已經釋放,但是他的指標地址仍然存在,只是指向了一塊已經釋放且無用的記憶體,所以我們建議release後直接賦個nil來置空。

一般,如果我們能知道需要實現功能所涉及的“className”的具體類名,就不建議使用init方法去初始化,比如以下程式碼:

NSString *strTest=[[NSString alloc] initWithString:@"test"]; (推薦)
NSString *strTest=[[NSString alloc] init];  (不推薦)

2.類方法和例項方法

簡單來說,例項方法就是得有了具體例項(物件)後才能使用的方法,一般以減號形式作為方法的字首來宣告,比如API定義

-(id)initWithString:(NSString *)aString;

相比而言,類方法則無需具體物件,只需要類的名稱即可呼叫,一般以加號形式作為方法的字首來宣告,比如API定義:

+(id)stringWithString:(NSString *)aString;

大可以將類方法理解為靜態方法,類方法在物件還沒創建出來之前已經有了。

3.屬性關鍵字

@property (nonatomic, assign) int B;
@property (nonatomic, retain) id classObj;

可以看到關鍵之@property後的括號出現了四個特徵性關鍵字:nonatomic

, assign , retain, settet, 這些關鍵字直接告訴編譯器後面的變數用何種方式來存取。

assign

賦值方式 不復制不保留,直接賦值 YES
基本資料型別和本類不直接擁有的物件

retain

賦值方式 將新值保留一份賦覆蓋原值 |NO |大部分物件可使用|

copy

賦值方式 將新值複製一份賦覆蓋原值 NO 字串選擇性使用

readwrite

讀寫許可權 生成getter和setter兩個方法 YES 變數可讀取可修改

readonly

讀寫許可權 只生成getter方法 NO 變數只讀不可修改
atomic 原子性 原子操作 YES 可以保留在多執行緒環境下,能安全的存取值

nonatomic

原子性 非原子操作 NO 不生成多執行緒同步內容

getter

存取方法 自定義取方法 NO

setter

存取方法 自定義賦值方法 NO

注:

  • 關於nonatomic,如果我們能確定不需要多執行緒訪問時,強烈推薦使用這個關鍵字,因為atomic對於效能的損失相對較大
  • 如果是類的delegate,推薦使用assign關鍵字,原因是避免了retain的死迴圈造成的物件無法真正的釋放

3.ARC新增關鍵字

ARC新增兩個武功高強的左右護法:strongweak

strong的含義和retain相同,weakassign相同,修飾完的屬性變數用法也是完全沒有改變,不過strongweak只能修飾物件。

蘋果官方對於ARC機制中物件的記憶體引用規則:

  • 任何物件,如果仍有持有者,就不會銷燬

  • 任何物件,已經沒有任何持有者,即自動銷燬

    持有者就是隻想物件的指標,如果是strong修飾的,即是物件的持有者,如果是weak屬性的,則不是持有者

4.ARC機制的使用規則

對於ARC機制的使用,蘋果釋出了幾條重要的規則需要開發者遵守。單單看那些生搬硬套的東西難免生澀,根據開發經驗將規則總結如下:

  1. 不能呼叫dealloc,不能重寫和呼叫retainreleaseretainCountautorelease,同理,@selector(retina),@selector(release)這些曲線救國的方法也不能呼叫。dealloc雖然能夠重寫,但是不能呼叫[super dealloc]之類的方法,CoreFoundation框架由於非從屬cocoa框架,所以CFRetainCFRelease仍然正常使用。

  2. 不能使用NSAllocateObjec或NSDeallocateObject函式來建立物件

  3. 不能在C語言的結構體中使用物件指標,同時建議用object-c的類來管理資料而不是結構體

  4. 不得使用NSAutoreleasePool物件。ARC中,全部使用@autorelease關鍵字代替,且比NSAutoreleasePool更高效

  5. 不得使用記憶體Zone,那些牽涉NSZone的方法都不得使用。

  6. 不得對一個屬性變數的取值方法命名以new開頭

  7. outlet均用weak關鍵字修飾,除非他是xib中最頂部的介面元素,則需要strong

  8. Core Foundation不適合ARC,該建立的仍建立,該釋放的仍釋放。

相關推薦

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

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

[黑馬程式設計師][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記憶體管理(二)

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------- OC記憶體管理1>記憶體管理原則 ①只要還有人在用某個物件,那麼這個物件就不會被回收;只要想用這個物件,就讓計數

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

——Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ——- 一、基本原理 (一)為什麼要進行記憶體管理。   由於移動裝置的記憶體極其有限,所以每個APP所佔的記憶體也是有限制的,當app所佔用的記憶體較多時,系統就會發出記憶體

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1. 控制set方法的記憶體管理 retain : release舊值,retain新值(用於OC物件)  assign : 直接賦值,不做任何記憶體管理(預設,用於非OC物件型別) copy   : release舊值,copy新值(一般用於NSString *) 2.  控制需不需生成set方法 re

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

一,為什麼要進行記憶體管理 1,由於移動裝置的記憶體有限,所以每個APP所佔的記憶體也是有限制的,當APP所佔用的記憶體較多時,系統就會發出警告,這時就需要回收一些不需要繼續使用的記憶體空間,比如回收一些不再使用的物件和變數等。 任何繼承NSObject的物件,對其他的基

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

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ------- 法則 誰建立記憶體誰就要釋放記憶體 管理機制 引用計數器 1使用alloc(相當於C語言中的malloc)為物件分配記憶體,使用dealloc(相當與C語言中的fre

黑馬程式設計師——OC語言基礎——面向物件三大特性之多型

繼前兩篇博文梳理了一下我對OC中面向物件三大特性的封裝、繼承之後。最重要也是最不容易理解的多型概念終於到來。 個人認為多型在三大特性中是最為重要的,但是由於它的概念性不容易用語言描述清楚,所以我還是想引用視訊教程中老師說的那句經典。 多型的實質就是: 父類的指標 指向了

黑馬程式設計師---關於記憶體分配問題

關於記憶體分配問題:    1:把程式新增到硬碟當中。    2: 系統內部使用載入器把Java檔案載入到記憶體當中。JAVA檔案會被解析為4個區:            ⑴: heap 區(堆區)  new出來的東西 比如類中的變數            ⑵: stack

黑馬程式設計師OC(@property和@synthesize)

1.  @property   @property用在@interface中,寫法如下: #import<Foundation/Foundation.h> @interface Person :NSObject { int _a

黑馬程式設計師--OC基礎--類方法、物件方法和self的使用

1、類方法 (1)類方法就是一個方法,它的使用不需要使用者去建立一個類的例項進行呼叫而可以直接通過類名對方法進行呼叫。 宣告一個類方法的格式: +(返回值型別) 方法名:(引數1型別)引數1名稱 方法名:(引數2型別)引數2名稱; 例: