[OC]MRC和ARC

OC中,建立了一個對象,就會在內存中開闢一個空間,obj的指針就指向這塊空間⬇️測試

referenceCount:引用計數器:存儲當前有多少指針引用這塊空間。spa

此時referenceCount爲1。3d

若是再建立其餘對象也指向obj⬇️obj就會調用retain方法:指針

referenceCount就會自動+1,此時referenceCount爲4(第一個obj建立NSObject alloc的時候就+1了)。對象

當不要一個對象的時候,若是調用release方法,referenceCount就會-1,若是obj1調用一次,obj2調用一次,obj3調用一次,referenceCount就會變爲1,若是最後obj也調用一次,referenceCount就會變爲0,此時系統將真正回收這塊空間。blog

如今建立的工程自動使用ARC,如何改成MRC呢?內存

建立一個Dog類,測試retain方法it

Dog *dog = [[Dog alloc]init];//開闢一個內存空間,指針dog指向該空間
NSLog(@"%zd",dog.retainCount);
Dog *dog1 = dog;
NSLog(@"%zd",dog.retainCount);

 這樣打印出來的retainCount都是1,也就是說並無多一個指針指向該空間。要如何解決呢?內存管理

Dog *dog1 = [dog retain];

 若是是這樣把dog的指針給dog1,此時retainCount就會變成2。table

若是要幹掉dog1,須要這樣操做⬇️

[dog1 release];//告訴dog少了一個指針指向它
dog1 = nil;//置爲空,避免亂指

 內存管理的黃金法則:

對一個OC對象進行alloc、retain、copy、mutableCopy的時候須要對該對象進行release或autoRelease操做。

當引用計數器爲0,object會調用一個析構方法,系統會回收內存空間,如今咱們在Dog類中重寫析構方法看看到底何時調用了dealloc方法⬇️

在.m文件中

-(void)dealloc
{
    NSLog(@"Dog is dead");
    [super dealloc];//回收內存
}

 接下來把狗一隻只殺死

[dog2 release];
dog2 = nil;
[dog release];
dog = nil;

 此時打印結果是這樣的:

咱們能夠看到,最後一隻狗dog被release的時候,系統調用了dealloc,此時引用計數器爲0。

相關文章
相關標籤/搜索