OC學習5 記憶體管理 上

2021-06-22 10:32:42 字數 3333 閱讀 9141

@一、範圍

任何繼承了

nsobject

的物件,對基本資料型別無效。

@二、原理

1.每個物件內部都儲存乙個與之相關聯的整數,稱為引用計數器

2.當使用

alloc

、new

或者copy

建立乙個物件的時候,物件引用計數器被設定為1

3.給物件傳送一條

retain

訊息,可以使引用計數器值+1

4.給物件傳送一條

release

訊息,可以使引用計數器值-1

5.當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統**,oc也會自動向物件傳送一條

dealloc

訊息。一般會重寫

dealloc

方法,在這裡釋放相關資源。一定不要直接呼叫

dealloc

方法。

6.可以給物件傳送

retaincount

訊息活得當前的引用計數器值。

@三、管理規則

1.誰建立,誰釋放(誰汙染,誰治理)。如果你通過

alloc

,new

或(mutable)

或copy

來建立乙個物件的話,那麼你必須呼叫

release

或者autorelease

。換句話說,不是你建立的你就不用釋放。

2.一般來說,除了

alloc

,new

,或者copy

之外的方法建立的物件都被宣告了

autorelease。

3.誰retain

,誰release

。只要你呼叫了

retain

,無論這個物件啊是如何生成的,你都要呼叫release。

@四、示例

@inte***ce student : nsobject

@property int age;

@end

上面是student類的宣告部分.h檔案,下面是實現部分.m檔案

@implementation student

@synthesize age = _age; // 在xcode4.5環境下可以省略

- (void)dealloc

@end

我們寫乙個測試方法來說明記憶體引用計數的變化

student *stu = [[student alloc] init]; // 1      // z代表無符號

nslog(@"count:%zi", [stu retaincount]);

[stu retain]; // 2

nslog(@"count:%zi", [stu retaincount]);

[stu release]; // 1

nslog(@"count:%zi", [stu retaincount]);

[stu release]; // 0

// [stu release]; // 會發生野指標錯誤,也就是說訪問了不屬於你的記憶體

再寫乙個示例說明:

// student物件的計數器永遠為1,所以不可能被釋放

[[student alloc] init].age = 10;

[student new].age = 10;

// 上面的**都有記憶體洩露

@五、物件之間的記憶體管理

物件之間的記憶體管理是經常見到的情況,我們來模擬一下學生(student)和書(book)之間的記憶體管理。首先student類宣告和實現部分如下:

@inte***ce student : nsobject 

@property int age;

- (id)initwithage:(int)age;

@property book *book;

- (void)readbook;

@implementation student

#pragma mark - 生命週期方法

#pragma mark 構造方法

- (id)initwithage:(int)age

return self;

}#pragma mark **物件

- (void)dealloc

#pragma mark - getter和setter

// @synthesize book = _book;

// 如果自己手動實現了getter和setter,xcode就不會自動生成@synthesize

// 也就不會自動生成_book

// getter和setter的預設實現

- (void)setbook:(book *)book

}- (book *)book

#pragma mark - 公共方法

#pragma mark 讀書

- (void)readbook

//#pragma mark - 私有方法

//#pragma mark 私有方法1

//- (void)test1 {}

//#pragma mark 私有方法2

//- (void)test2 {}

//#pragma mark 私有方法3

//- (void)test3 {}

@end

book類的宣告和實現部分如下:
@inte***ce book : nsobject

@property float price; // **

- (id)initwithprice:(float)price;

@end

@implementation book

- (id)initwithprice:(float)price

return self;

}- (void)dealloc

@end

下面在main方法中對記憶體管理進行測試分析,示例如下:

void test(student *stu) 

void test1(student *stu)

int main(int argc, const char * argv)

return 0;

}

通過分析,加深對記憶體管理的了解。熟記口訣,牢記原則。

oc學習之旅 記憶體管理

因為以前的 都是使用非arc 手動管理 而arc還不太完善,因此學習非arc模式還是有必要的。在用非arc模式 引用計數器概念 oc中,在oc定義的型別都設計有乙個引用計數器retaincount。而oc中的引用分兩種,一種是強引用retain 對應arc中的strong 另一種是弱引用assign...

IOS學習 OC記憶體管理

記憶體管理 引用計數器 oc物件被引用的次數,為0的時候該物件被銷毀,記憶體 retain 引用次數 1 返回的是物件本身 release 引用次數 1 沒有返回值 retaincount 獲取引用次數。dealloc oc物件被銷毀的時候會呼叫dealloc方法,繼承該 方法 放最後面 super...

OC 記憶體管理 記憶體5大區域

棧區域 系統自動分配.儲存區域性變數 如 int num 10,int p num。num 與 p 都儲存在棧區域 堆區域 允許程式設計師手動的從堆申請空間來使用,要主動釋放。除非程式結束 如 int 4,float 4 malloc,calloc bss段區域 儲存未初始化的全域性變數 靜態變數,...