Objective-C中得MRC與ARC

MRC

內存管理

任何繼承自NSObject的對象都需要內存管理,非對象類型不需要(int、char、float、double、struct、enum等 )
OC通過引用計數來判斷是否需要回收一個對象所佔用的內存,每一個OC對象都有自己的引用計數器,是一個4個字節的整數,表示多少人正在使用這個對象。如果引用計數器爲0時,對象的內存就會被回收,如果不爲0就不會被回收。

當使用alloc、new、copy創建一個對象是,對象的引用計數爲1.
給對象發一個retain消息,可以使引用計數+1
給對象發一個release消息,可以使引用計數器-1
給對象發送retainCount消息, 可以獲得當前的引用計數器值
當一個對象的引用計數器值爲0時
這個對象即將被銷燬,其佔用的內存被系統回收
系統會自動給對象發送一條dealloc消息
(因此, 從dealloc方法有沒有被調用, 就可以判斷出對象是否被銷燬)
一旦重寫了dealloc方法, 就必須調用[super dealloc],並且放在最後面調用

//.h
@interface ZZPerson : NSObject


- (void) test;

@end
//.m
@implementation ZZPerson


- (void) test
{
    NSLog(@"Person test");
}

-(void) dealloc
{
    NSLog(@"Person 回收");
    [super dealloc];
}

@end

int main(int argc, const char * argv[]) {

    ZZPerson *person = [[ZZPerson alloc] init];//1

    long count  = [person retainCount];
    NSLog(@"%zd",count);//1

    [person retain];
    NSLog(@"%zd",[person retainCount]);//2
    [person release];

    NSLog(@"%zd",[person retainCount]);//1
    [person release];// Person 回收

    person = nil;
//  當一個指針指向 nil,這個指針我稱爲空指針
//  給空指針發送消息系統不會報錯,它什麼都不做
    [person test];

    NSLog(@"%zd",[person retainCount]);
    return 0;
}

內存管理原則

  1. 誰創建誰release : 如果你通過alloc、new或[mutable]copy來創建一個對象,那麼你必須調用release或autorelease
  2. 誰retain誰release :只要你調用了retain,就必須調用一次release

property參數

retain : release舊值,retain新值(用於OC對象)
assign : 直接賦值,不做任何內存管理(默認,用於非OC對象類型)
copy : release舊值,copy新值(一般用於NSString *)

循環retian

多個對象相互retiam,比如A對象retain了B對象,B對象retain了A對象,這樣會導致A對象和B對象永遠無法釋放
循環retain的解決方案
循環的一端用assign

autorelease

autorelease方法的基本作用
1. 給對象發送一條autorelease消息, 會將對象放到一個自動釋放池中
2. 當自動釋放池被銷燬時,會對池子裏面的所有對象做一次release操作
3. 會返回對象本身
4. 調用完autorelease方法後,對象的計數器不變

autorelease的好處
1. 不用再關心對象釋放的時間
2. 不用再關心什麼時候調用release

autorelease的使用注意
1. 佔用內存較大的對象不要隨便使用autorelease
2. 佔用內存較小的對象使用autorelease,沒有太大影響

自動釋放池@autoreleasepool

當一個對象調用autorelease方法時,會將這個對象放到棧頂的釋放池
當自動釋放池被銷燬時,釋放對象。

ARC

編譯器會自動在適當的地方插入適當的retain、release、autorelease語句
也就是說, 編譯器會自動生成內存管理的代碼, 不用程序猿手動編寫

不能調用release、retain、autorelease、retainCount

可以重寫dealloc,但是不能調用[super dealloc]

ARC中的@property
1. strong : 用於OC對象, 相當於MRC中的retain
2. weak : 用於OC對象, 相當於MRC中的assign
3. assign : 用於基本數據類型, 跟MRC中的assign一樣
4. copy : 一般用於NSString, 跟MRC中的copy一樣

MRC轉爲ARC

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章