IOS 筆記 《一》 記憶體管理

2021-07-04 18:08:37 字數 2670 閱讀 5944

[^footnote]ps:學習ios很長時間了,一直沒總結過,以後盡量一周寫一篇。

提到記憶體管理就要提mrr(manual retain-release)arc(automatic reference counting)

先說mrr(manual retain-release)

oc建立物件原理

1.分配記憶體空間,儲存物件

2.初始化成員變數

3.反回物件的指標位址

mine *mine = [mine alloc] init];

//或 mine *mine = [mine new];

1.物件在完成建立的同時,內部會自動建立乙個引用計數器,這個計數器,是系統用來判斷是否**物件的唯一依據,當我們的引用計數retaincount = 0的時候,系統會毫不猶豫**當前物件

2.[物件 release] reatincount - 1

3.[物件 retain] reatincount + 1 ,返回self

4.我們的引用計數retaincount = 0的 物件就被銷毀了

.dealloc函式,當乙個物件要被銷毀的時候,系統會自動呼叫dealloc函式,通知物件你將要被銷毀

所以mrr原則:只要出現了 new,alloc,retain,就一定配對出現乙個release,autorelease

一般造成野記憶體洩漏有幾種情況,reatincount不為0,reatincount為0了,物件沒有=nil,而還在使用這個物件

(預設情況下xcode為了提高編碼效率,不會時時檢查殭屍物件) ,還有就是 物件先為nil ,在release。

多個物件相互應用就要 用 autorelease 放到池子裡,自動 release 一次。

重點說arc(automatic reference counting)

1.強指標 strong

2.弱指標 weak

只要有強指標指向乙個物件,那麼系統就不會**該物件

只要沒有強指標指向物件,系統立即**該物件

//弱指標不影響,物件被**

使用arc必須遵守的規則

l 不可以再顯示呼叫dealloc、或實現呼叫retain、release、retaincount、autorelease這些方法。也不能使用@selector(retain), @selector(release),等等。

在arc下去自定義dealloc方法不需要呼叫 [super dealloc],(實際上如果你呼叫了 [super dealloc],編譯器會報錯)。super的呼叫是由編譯器自動強制執行的。

l 不能使用nsallocateobject或nsdeallocateobject。

使用alloc來建立物件,由arc來管理物件執行時的釋放。

l 不能在c語言的結構體中使用物件指標。

建議使用objective-c的class來管理資料格式,來代替c語言的struct。

l 不能隱式轉換 id和void *。

你必須告訴編譯器轉換的型別。當你需要在obj-c的物件和core foundation 型別之間轉換時,你可以通過函式的引數來做。詳見「managing toll-free bridging」

l 不能使用nsautoreleasepool物件。

l 不能使用memory zone。

因為現在objective-c執行時已經忽略nszone了,所以沒必要再使用nszone了

property 屬性

l assign: 簡單賦值,不更改索引計數(reference counting)。

l retain:釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為1

retain的實際語法為:

說了那麼麻煩,其實接下來的話最重要:

如果你不懂怎麼使用他們,那麼就這樣

· 使用assign: 對基礎資料型別 (nsinteger,cgfloat)和c資料型別(int, float, double, char, 等等)

· 使用copy: 對nsstring

· 使用retain: 對其他nsobject和其子類

l nonatomic關鍵字:

atomic是objc使用的一種執行緒保護技術,基本上來講,是防止在寫未完成的時候被另外乙個執行緒讀取,造成資料錯誤。而這種機制是耗費系統資源的,所以在iphone這種小型裝置上,如果沒有使用多執行緒間的通訊程式設計,那麼nonatomic是乙個非常好的選擇。

ios 5 中對屬性的設定新增了strong 和weak關鍵字來修飾屬性(ios 5 之前不支援arc)

l strong關鍵字:

strong 用來修飾強引用的屬性;對應原來的retain。

該屬性值對應 __strong 關鍵字,即該屬性所宣告的變數將成為物件的持有者。

l weak關鍵字:

weak 用來修飾弱引用的屬性;對應原來的assign。

但是不同的是當物件被釋放以後,物件自動賦值為nil;並且,delegate 和 outlet 蘋果推薦用 weak 屬性來宣告。同時,如上一回介紹的 ios 5 之前的版本是沒有 __weak 關鍵字的,所以 weak 屬性是不能使用的。這種情況我們使用 unsafe_unretained。

iOS記憶體管理 一

1.內總管理原則 引用計數 ios的物件都繼承於nsobject,該物件有乙個方法 retaincount 記憶體引用計數。引用計數在很多技術都用到 window下的com元件,多執行緒的訊號量,讀寫鎖,思想都一樣。一般情況下 後面會討論例外情況 alloc 物件分配後引用計數為1 retain 物...

iOS筆記 手動記憶體管理

建立物件 1.分配記憶體空間,儲存物件 2.初始化成員變數 3.反回物件的指標位址 1.物件在完成建立的同時,內部會自動建立乙個引用計數器,這個計數器,是系統用來判斷是否 物件的唯一依據,當我們的引用計數retaincount 0的時候,系統會毫不猶豫 當前物件 2.物件 release reati...

ios學習筆記之記憶體管理

一,記憶體管理型別定義 1,基本型別 任何c的型別,eg int,short,char,long,long long,struct,enum,union等屬於基本型別或結構體 記憶體管理對於c語言的基本型別無效 2,oc型別 非基本型別 任何繼承於nsobject類的物件都屬於oc型別 也就是除了c...