iOS記憶體管理(ARC,MRC)

2022-08-05 04:57:20 字數 2969 閱讀 2943

ios記憶體管理方式:

arc automatic reference counting 自動引用計數

mrc manual reference counting 手動引用計數

更改管理方式:

記憶體管理的問題:

1、記憶體洩露:不再需要的物件沒有釋放。

2、野指標:正在使用的物件提前釋放。

引用計數:

1、每乙個物件上都有乙個引用計數器

2、當物件出生時引用計數器為1

3、當物件呼叫retain方法時引用計數器+1

4、當物件呼叫release方法時引用計數器-1

5、當乙個物件引用計數為0時,這個物件立即被**

殭屍物件:過度釋放的物件。

dealloc 方法:

當物件的retaincount=0時自動呼叫。

dealloc裡release成員變數物件。

dealloc必須呼叫父類方法,[super dealloc]必須放在最後。

dealloc由系統自動呼叫,不能手動呼叫。

dealloc的優化 self.dog = nil;

記憶體管理原則:

誰申請,誰釋放。

申請的方法:alloc new  copy mutablecopy retain

釋放的方法:release

@property修飾詞補充:

1、預設assign

2、assign 主要修飾基本資料型別 int long float double 不新增任何管理記憶體的**

3、retain 主要修飾oc物件 新增管理記憶體的**

autorelease自動釋放池

(一)基本用法

(1)會將物件放到乙個自動釋放池中

(2)當自動釋放池被銷毀時,會對池子裡的所有物件做一次release

(3)會返回物件本身

(4)呼叫完autorelease方法後,物件的計數器不受影響(銷毀時影響)

(二)好處

(1)不需要再關心物件釋放的時間

(2)不需要再關心什麼時候呼叫release

(三)使用注意

(1)占用記憶體較大的物件,不要隨便使用autorelease,應該使用release來精確控制

(2)占用記憶體較小的物件使用autorelease,沒有太大的影響

(四)錯誤寫法

(1)連續呼叫多次autorelease,釋放池銷毀時執行兩次release(-1嗎?)

(2)alloc之後呼叫了autorelease,之後又呼叫了release。

(五)自動釋放池

(1)在ios程式執行過程中,會建立無數個池子,這些池子都是以棧結構(先進後出)存在的。

(2)當乙個物件呼叫autorelease時,會將這個物件放到位於棧頂的釋放池中

(六)自動釋放池的建立方式

(1)ios 5.0以前的建立方式

nsautoreleasepool *pool=[[nsautoreleasepool alloc] init];

[pool release];//[pool drain];用於mac

(2)ios5.0以後

@autoreleasepool

//結束代表銷毀自動釋放池

(七)autorelease注意

(1)系統自帶的方法中,如果不包含alloc new copy等,則這些方法返回的物件都是autorelease的,如[nsdate date];

(2)開發中經常會寫一些類方法來快速建立乙個autorelease物件,建立物件時不要直接使用類名,而是使用self

arc記憶體管理機制

(一)arc的判斷準則:

只要沒有強指標指向物件,物件就會被釋放。

(二)指標分類:

(1)強指標:預設的情況下,所有的指標都是強指標,關鍵字__strong

(2)弱指標:_ _weak關鍵字修飾的指標

宣告乙個弱指標如下:

__weak person *p;

arc中,只要弱指標指向的物件不在了,就直接把弱指標做清空操作。

__weak person *p=[[person alloc] init];//不合理,物件一建立出來就被釋放掉,物件釋放掉後,arc把指標自動清零。

arc中在property處不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。

@property(nonatomic,strong)dog *dog;// 意味著生成的成員變數_dog是乙個強指標,相當於以前的retain。

如果換成是弱指標,則換成weak,不需要加__。

(三)arc的特點總結:

(1)不允許呼叫release,retain,retaincount

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

(3)@property的引數:

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

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

assign:適用於非oc物件型別(基礎型別)

mrc環境get方法實現:

//atomic下get方法

- (keyborad *)kb {

[_kb retain];

[_kb autorelease];

return _kb;

//nonatomic下get方法

- (keyborad *)kb {

return _kb;

mrc轉arc:

mrc與arc混編:

arcmrc

在的選項下下選擇要不使用編譯的檔案,雙擊它,輸入-fno-objc-arc即可

mrc工程中也可以使用arc的類。

在的選項下下選擇要使用編譯的檔案,雙擊它,輸入即可

迴圈引用:a物件強指標引用了b物件,b物件強指標引用了a物件,彼此引用無法銷毀。

解決方法:將其中的一條強指標改成用weak修飾的弱指標。

記憶體管理 ARC MRC

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.擔心傳出去的空間,別人沒用完...

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

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

ios記憶體管理

引用計數 每個物件有乙個與之相關的整數,稱作 引用計數器 或者 保留計數器 當某段 需要訪問乙個物件時,該段 會將物件的保留計數器 1,表示需要訪問這個物件 當結束對該物件的訪問時,保留計數器 1,表示它不在訪問該物件 當保留計數器為0時,物件被銷毀,所佔記憶體被系統收回。當使用new retain...