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。