標籤:
iOS記憶體管理方式:
ARC Automatic Reference Counting 自動引用計數
MRC Manual Reference Counting 手動引用計數
更改管理方式:
記憶體管理的問題:
1、記憶體泄露:不再需要的對象沒有釋放。
2、野指標:正在使用的對象提前釋放。
引用計數:
1、每一個對象上都有一個引用計數器
2、當對象出生時引用計數器為1
3、當對象調用retain方法時引用計數器+1
4、當對象調用release方法時引用計數器-1
5、當一個對象引用計數為0時,這個對象立即被回收
殭屍對象:過度釋放的對象。
iOS為了最佳化app效能,不會馬上處理殭屍對象,可以開啟殭屍模式。
dealloc 方法:
當對象的retainCount=0時自動調用。
dealloc裡release成員變數對象。
dealloc必須調用父類方法,[super dealloc]必須放在最後。
dealloc由系統自動調用,不能手動調用。
dealloc的最佳化 self.dog = nil;
記憶體管理原則:
誰申請,誰釋放。
申請的方法:alloc new copy mutableCopy retain
釋放的方法:release
@property修飾詞補充:
1、預設assign
2、assign 主要修飾基礎資料型別 (Elementary Data Type) 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修飾的弱指標。
iOS記憶體管理(ARC,MRC)