1. 程式人生 > >黑馬程式設計師 OC基礎: 記憶體管理

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

記憶體管理

簡述

每個 oc 物件都有自己的引用計數器,是一個整數,表示”物件被引用的次數”.佔四位元組
計數器預設值為1
當為0時,物件佔用的記憶體會被系統回收.

引用的操作

給物件傳送一條 retain 計數器+1
給物件傳送一條 release 技術器-1
傳送 retainCount 訊息獲得計數值

物件被銷燬時,系統會向物件傳送一條 dealloc 訊息
因此我們可以重寫 dealloc 方法實現物件的”遺言”(一定要呼叫[super dealloc],並放在最後面)

記憶體管理原則

只要有人在用某個物件,那麼這個物件就不會被回收

只要想用該物件,就讓物件的計數器+1
當不再使用這個物件時,就讓物件的計數器-1

注: 上述方法重寫 dealloc 和 set 方法可以實現

記憶體管理程式碼規範

只要呼叫 alloc , 必須有 release (或 autorelease)

set 方法的程式碼規範

a. 基本資料型別: 直接複製

- (void) setAge:(int)age
  {
      _age = age;
  }

b. oc物件型別

- (void)setCar:(Car *)car
{

    if ( car != _car)  // 1.先判斷是不是新傳進來的物件
    {

        [_car release];  // 2. 對舊物件做一次 release
_car = [car retain]; // 3. 對新物件做一次 retain } }

dealloc 的方法程式碼規範

a. 一定要[ super dealloc], 而且放到最後

b. 對 self( 當前)所擁有的其他物件做一次 release

(void)dealloc
{
    [_car release];
    [super dealloc];
} 

如果物件不是由 alloc 產生的,就不需要 release .

@property 的記憶體管理

@property (retain) Book *book;

有了 property 會自動生成我們剛剛寫的那些 set 程式碼,省時省力.
(retain) : 在生成的 set 方法裡, release 舊值 retain 新值.

但是由於 @property 不影響 dealloc ,所以 dealloc 中的 release 還需要我們自己寫

@property 的四類引數

1.set 方法記憶體管理相關引數

 * retain : release舊值, retain 新值
 * assign : 直接賦值(預設,適用於非oc 物件型別)
 * copy   : release 舊值, copy 新值

2.是否要生成 set 方法

 * readwrite : 同時生成 setter 和 getter 的宣告和實現
 * readonly  : 只會實現 getter 的宣告和實現

3.多執行緒管理

 * nonatomic : 效能高 (一般就用這個效能高的)
 * atomic    : 效能低 (預設)

4.setter 和 getter 方法的名稱

 @property (getter = myWeight) int weight;
 getter 方法的名稱就背改為了 我們自定義的 myWeight

 @property (getter = myWeight,setter = myWeight:) int weight;
 同樣, setter 方法名也被修改. 但是注意要加上:冒號才是完整的 setter 方法名

 不過這種方法並不常用,只有在 bool 型別資料時,為了命名規範才會這麼使用
 @property (getter = isRich) BOOL rich;

注: 衝突型別的引數不能重複寫

@class 類名

@class 僅僅是一個類的宣告,當兩個檔案中的類相互引用時可用@ class

在真正需要用到我們寫的類時,依然需要 @import 將類的方法匯入檔案

@class 的作用: 僅僅告訴編譯器,某個名稱是一個類

在開發中引用一個類的規範

1 在 .h 檔案中用 @class 來宣告類

2 在 .m 檔案中用 #import 來包含類的所有東西

兩端迴圈應用解決方案

1 一段用 retain

2 一段用 assign

autorelease

1 autorelease會將物件放到一個自動釋放池中

2 當自動釋放池被銷燬時,會對池子裡面的所有物件做一次 release 操作

3 會返回物件本身

4 呼叫完 autorelease 方法後,物件的計數器不變

節省了每次在程式尾部寫一個 release 的操作

    @autoreleasepool{// { 開始表示建立一個釋放池


    }   // } 結束表示銷燬釋放池

autoreleasepool 是以棧的資料結構來實現的

缺點: 不能精確控制物件釋放時,所以一般用在佔用記憶體較小物件是.否則儘量使用 release

好處: 不用再關心物件釋放的時間,不用在關心什麼使用呼叫 release

自動釋放池

在 iOS 程式執行過程中,會建立無數個池子.這些池子都是以棧結構存在(先進後出)
當一個物件呼叫 autorelease 方法時,會將這個物件放到棧頂的釋放池

系統自帶的方法裡面沒有包含 alloc/new/copy 說明返回的物件都是 autorelease 的
在開發中經常會提供一些類方法,快速建立一個已經 autorelease 過的物件

建立物件時儘量不用類名,用 self 相容性會更高.

ARC

ARC的判斷準則: 只要沒有強指標指向物件,就會釋放物件

指標分為2種:

強指標: 預設情況下,所有的指標都是強指標 __strong
弱指標: __weak

ARC特點

1.不允許呼叫 release/retain/retainCount

2.允許重寫 dealloc, 但是不允許呼叫[ super dealloc]

[email protected] 的引數

也就是說,上面我們寫過的步驟統統可以省去了.節省大量精力.

strong : 成員變數是強指標,相當於原來的 retain(適用於 oc 物件型別)
weak   : 成員變數是弱指標,相當於 assign( 適用於 oc 物件型別)
assign : 適用於非 oc 物件型別

weak 的應用場合

當兩個類迴圈引用的時候.出現記憶體無法釋放的時候

解決方法:

ARC

  一段用 strong, 另一段用 weak

非 ARC

  一段用 retain, 另一段用 assign

相關推薦

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

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

黑馬程式設計師——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記憶體管理

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

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

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

黑馬程式設計師——OC基礎——set方法和get方法

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 我們在OC中定義一個類的時候,它的成員變數預設情況下是@protected的。這是因為我們的成員變數一般不允許直接去訪問,如果需要修改和訪問成員變數我們

黑馬程式設計師——OC基礎——構造方法

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 前面我們用OC的類建立物件的時候我們用的是new方法。其實new方法是一個組合的方法,它是由兩個方法組合在一塊的,分別是alloc方法和init方法。其

黑馬程式設計師——OC基礎---Foundation框架之結構體

一、概述 Foundation—基礎框架。框架中包含了很多開發中常用的資料型別,如結構體,列舉,類等,是其他ios框架的基礎。 如果要想使用foundation框架中的資料型別,那麼包含它的主標頭檔案就可以了。 即#import #import &l

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

記憶體管理 ------ IOS培訓、android培訓、期待與您交流!------- 一、基本原理:    1、記憶體管理的定義       1>、移動移動裝置的記憶體極其有限,每個app所能佔用的記憶體是有限制的       2>、當app所佔用的記憶體

黑馬程式設計師--OC基礎[email protected]和@synthesize

1、@property關鍵字 (1)基本概念 @property是編譯器指令,所謂編譯器指令,就是告訴編譯器要做什麼。 @property告訴編譯器宣告屬性的訪問器(setter/getter)方法,這樣的好處是免去了程式設計師編寫set和get的

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

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

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

=====================引用計數器開始==================== 基本型別資料存放在棧中,物件存放在堆中 棧中的資料系統自動回收 堆空間中的資料動態分配,不能自動分配,容易引起記憶體洩露 需要給物件傳送訊息,讓它回收,即呼叫物件的回收方法

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

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

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

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

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

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

[黑馬程式設計師][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對記憶體管理的方法