ARC: Automatic(自動) Reference(引用) Counting(計數(shù))
什么是自動引用計數(shù)?
不需要程序員管理內容, 編譯器會在適當?shù)牡胤阶詣咏o我們添加release/retain等代碼
注意點: OC中的ARC和java中的垃圾回收機制不太一樣, java中的垃圾回收是系統(tǒng)干得, 而OC中的ARC是編譯器在編譯的時候加上release和retain方法
MRC: Manul(手動) Reference(引用) Counting(計數(shù))
什么是手動引用計數(shù)?
所有對象的內容都需要我們手動管理, 需要程序員自己編寫release/retain等代碼
內存管理的原則就是有加就有減
也就是說, 一次alloc對應一次release, 一次retain對應一次relese
一個項目可以從MRC切換到ARC下奥喻,如圖:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 只要創(chuàng)建一個對象默認引用計數(shù)器的值就是1
Person *p = [[Person alloc] init];
NSLog(@"retainCount = %lu", [p retainCount]); // 1
// 只要給對象發(fā)送一個retain消息, 對象的引用計數(shù)器就會+1
[p retain];
NSLog(@"retainCount = %lu", [p retainCount]); // 2
// 通過指針變量p,給p指向的對象發(fā)送一條release消息
// 只要對象接收到release消息, 引用計數(shù)器就會-1
// 只要一個對象的引用計數(shù)器為0, 系統(tǒng)就會釋放對象
[p release];
// 需要注意的是: release并不代表銷毀\回收對象, 僅僅是計數(shù)器-1
NSLog(@"retainCount = %lu", [p retainCount]); // 1
[p release]; // 0
NSLog(@"--------");
}
// [p setAge:20];
return 0;
}