OC 內存管理

ARC(Automatic Reference Counting)

簡單地說就是, 系統自動對內存進行管理, 自動添加 retain 和 release 方法. 而不再需要程序員手動添加. 這裏暫時不做詳細介紹.

MRC(Manual Reference Count)

需要程序員自己寫 retain 和 release 方法來進行內存管理. 下面就對在 MRC 中用到的有關內存管理的方法(在 ARC 中不能使用)做一個總結.(以 Person 類爲例)

retainCount

該方法可獲得對象空間中的引用計數, 返回值爲 NSUInteger.

retain 和 copy

Person *per = [[Person alloc] initWithName:@"zhangsan" Gender:@"man" Age:18];
Person *per1 = [per retain];//使用 retain 將per 的值賦給 per1
NSLog(@"%lu", [per1 retainCount]);//輸出結果爲 : 2
NSLog(@"%lu", [per retainCount]); //輸出結果爲 : 2
NSLog(@"%lu", per); //per 的地址爲 : 0x100400220
NSLog(@"%lu", per1);//per1的地址爲 : 0x100400220
Person *per = [[Person alloc] initWithName:@"zhangsan" Gender:@"man" Age:18];
Person *per1 = [per copy];//使用 copy 將per  對象的值賦給 per1對象
NSLog(@"%lu", [per1 retainCount]);//輸出結果爲 : 1
NSLog(@"%lu", [per retainCount]); //輸出結果爲 : 1
NSLog(@"%lu", per); //per 的地址爲 : 0x100120db0
NSLog(@"%lu", per1);//per1的地址爲 : 0x100120c10

由上兩例可知:

  • retain 是指針拷貝, copy 是內容拷貝.
  • retain 是將per1指向之前per開闢的堆區空間的地址, 引用計數 + 1
  • copy 是重新開闢一塊堆區空間給 per1, 再將 per 的值賦給 per1, per 指向的空間的引用計數還是 1.

copyWithZone

如果要使用 copy 方法的話, 就需要 Person 類遵循 NSCopying 協議. 並將copyWithZone重寫, 重寫方法如下:

// 該方法在使用 copy 時, 自動調用
- (id)copyWithZone:(NSZone *)zone {
    Person *p = [[Person allocWithZone:zone] init];//這裏的p 不需要釋放, 否則會出現野指針問題
    return p;
}

release

release 方法在調用之後立即釋放內存, 且在調用該方法之後不能再調用 retainCount 方法, 否則系統會立即崩潰. 使用方法:

[per release];

autorelease

autorelease 方法在調用之後不會立即釋放內存, 如果 autorelease 在一個自動釋放池裏, 那麼在釋放池結束時, 會順道將 autorelease 要釋放的內存釋放掉. 使用方法:

[per autorelease];

alloc 和 dealloc

alloc 可以申請出一塊地址, 而dealloc 是對堆區內存空間回收.
dealloc 的使用方法如下:

- (void)dealloc {
    [super dealloc];//調用父類的 dealloc 方法.
    NSLog(@"調用 dealloc");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章