記憶體管理 ARC MRC

2021-07-24 07:20:08 字數 4351 閱讀 9396

char *p = malloc(100);   //在堆中開闢100個位元組空間

strcpy(p,"hello");

nslog(@"p = %s",p);

fun1(p);

fun2(p);

//c記憶體管理的隱患:

//free(p); //1.當fun1,fun2沒用完malloc空間,執行了free,造成提前釋放--野指標

//2.擔心傳出去的空間,別人沒用完,所有人都不去釋放--記憶體洩漏

free(p); //3.所有人都擔心記憶體沒釋放,都執行free,造成重複釋放 -- 奔潰

//oc中改善記憶體管理的機制--引用計數

//引用計數: arc 、mrc

//arc: 自動引用計數-(預設)

//mrc: 手動引用計數## 標題 ##

int main(int argc, const

char * argv)

nslog(@"程式即將結束");

return

0; }

//析構方法:釋放記憶體的方法;程式執行完畢,進入dealloc,說明已經釋放該物件

- (void)dealloc

int main(int argc, const

char * argv)

nslog(@"應用程式執行結束");

return

0; }

int main(int argc, const

char * argv)

return

0;}

nsstring *str = [[nsstring alloc] init];

//在字串中不能用retaincount來獲取引用計數

nslog(@"retaincount = %ld",[str retaincount]); //-1

進行retain

nsstring *str1 = [str retain]; //引用計數+1

//字串通過列印位址的方式,驗證引用計數是否+1

nslog(@"str1:%p,str: %p",str1,str);

[str release]; //內部遵循記憶體管理的**法則

[str1 release];

nsmutablestring *mutstr = [[nsmutablestring alloc] init];

進行retain

nsmutablestring *mutstr1 = [mutstr retain]; //引用計數+1

nslog(@"mutstr:%p,mutstr1:%p",mutstr,mutstr1);

//結論:可變與不可變字串進行retain,引用計數都+1;

進行copy

nsstring *str2 = [str copy]; //引用計數+1

nslog(@"str: %p,str2: %p",str,str2);

進行copy

nsstring *str3 = [mutstr1 copy]; //引用計數不+1

nslog(@"str3 = %p,mutstr1=%p",str3,mutstr1);

//結論:不可變進行copy引用計數+1,可變不+1;

進行mutablecopy

nsmutablestring *mutstr2=[str3 mutablecopy]; //引用計數不+1

nslog(@"mutstr2=%p,str3 = %p",mutstr2,str3);

進行mutablecopy

nsmutablestring *mutstr3 = [mutstr2 mutablecopy];//引用計數不+1

nslog(@"mutstr3=%p,mutstr2=%p",mutstr3,mutstr2);

//結論:可變與不可變字串進行mutablecopy,引用計數都不+1;

////深拷貝:引用計數不+1、字串的mutablecopy始終為深拷貝

//淺拷貝:引用計數+1、字串的retain始終為淺拷貝

person *p1 = [[person alloc] init];

person *p2 = [[person alloc] init];

person *p3 = [[person alloc] init];

//1. 當元素物件放入陣列,每乙個物件的引用計數都+1

nsmutablearray *mutarr = [[nsmutablearray alloc] initwithobjects:p1,p2,p3, nil];

nslog(@"p1 count = %ld",p1.retaincount); //2

nslog(@"p2 count = %ld",p2.retaincount); //2

nslog(@"p3 count = %ld",p3.retaincount); //2

//2.在陣列中新增乙個物件,那麼該物件的引用計數+1

[mutarr addobject:p1];

nslog(@"p1 count = %ld",p1.retaincount); //3

nslog(@"p2 count = %ld",p2.retaincount); //2

nslog(@"p3 count = %ld",p3.retaincount); //2

//3.陣列中移除乙個物件,那麼該物件的引用計數-1

[mutarr removeobject:p3];

nslog(@"p1 count = %ld",p1.retaincount); //3

nslog(@"p2 count = %ld",p2.retaincount); //2

nslog(@"p3 count = %ld",p3.retaincount); //1

//4.陣列中溢位所有物件,那麼每乙個物件的引用計數都-1

[mutarr removeallobjects];

//[mutarr release];

nslog(@"p1 count = %ld",p1.retaincount); //1

nslog(@"p2 count = %ld",p2.retaincount); //1

nslog(@"p3 count = %ld",p3.retaincount); //1

[p1 release]; //引用計數為0,呼叫dealloc

[p2 release]; //引用計數為0,呼叫dealloc

[p3 release]; //引用計數為0,呼叫dealloc

//1.回顧c記憶體管理的缺陷

//a. 提前釋放 b. 重複釋放 c. 沒有釋放

//2.引用計數的概念:

//a. arc: 自動引用計數,退出自動釋放池,系統自動會釋放記憶體空間

//b. mrc: 手動引用計數;

//b1. 記憶體管理的**法則;

//b2. mrc預設的呼叫方法及標準寫法

//呼叫方法:retain、retaincount、release、dealloc

//標準寫法:記住復合類記憶體管理,字串在類中的記憶體管理

//3. 字串的記憶體管理

//深拷貝與淺拷貝的概念

//4. 陣列的記憶體管理

//記住4個結論

與autorelease

//release: 引用計數-1(mrc推薦使用)

//autorelease: 有延時的引用計數-1

main:

int main(int argc, const

char * argv)

return

0; }

car:

@implementation

car //setter函式

-(void)setengine:(engine *)engine

}//getter函式

-(engine *)engine

//car物件初始化

-(id)initwithengine:(engine *)engine

return

self;

}//重寫dealloc

- (void)dealloc

@end

engine:

@implementation

engine

//重寫dealloc

- (void)dealloc

@end

iOS記憶體管理(ARC,MRC)

ios記憶體管理方式 arc automatic reference counting 自動引用計數 mrc manual reference counting 手動引用計數 更改管理方式 記憶體管理的問題 1 記憶體洩露 不再需要的物件沒有釋放。2 野指標 正在使用的物件提前釋放。引用計數 1 每...

ios記憶體管理(ARC MRC 記憶體分割槽 野指標)

返回上級目錄 ios面試和知識點整理 ios中arc機制詳解 ios arc全解?mrc誰建立,誰釋放 誰引用,誰管理 或者說使用mrc,需要遵守誰建立,誰 的原則。也就是誰alloc,誰release 誰retain,誰release。ios記憶體管理機制解析 一般容易造成洩漏的點 常規的檢測方法...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...