標籤:io cti re c 管理 時間
這幾天學習objective-c,簡單談談對其記憶體管理機制的理解和看法,有想法的或不同意見的可以一起交流一下,首先objective-c採用了引用計數機制來對記憶體進行管理。當我們聲明一個執行個體對象,並為其在堆中開闢記憶體空間,其記憶體空間引用計數為1,如果我們release 引用計數減一,當引用計數等於0時,系統就會回收記憶體。
我們都知道在objective-c中引用由3種方式:
1)assign :Fraction* b=[[Fraction alloc] init];Fraction* a=b;
2)retain:Fraction* b=[[Fraction alloc] init];Fraction* a=b;[b retain];
3)copy Fraction* b=[[Fraction alloc] init];Fraction* a=[b copy];
第一種assign就是簡單的賦值,讓a指向b所指向堆中的記憶體空間,引用計數不加1,任然為1;如果我們在後面[a release],引用計數減一,所指向記憶體引用計數為0,記憶體被回收,那b就成為沒有指向的野指標;
第二種retain,我們知道retain,引用計數加一,當我們[b release],引用計數為1,記憶體不會被釋放,a依然能夠正常指向,正常引用。
第三種更為靈活,我們需要重寫copyWithZone方法來自訂拷貝,我們可以淺拷貝(返回地址,引用計數不加一),可以retain,也可以直接開闢一塊新的記憶體空間複製內容進行深拷貝。
所以,我們一般採用retain引用,為了我們正常引用,防止記憶體溢出、野指標導致系統奔潰這些情況,我們在引用一個執行個體對象時需要retain,引用結束需要release,為什麼這樣說呢,這是為了保證本次引用能夠正常進行,不受外部release的影響而使其執行個體變數成為野指標,導致系統崩潰。注意:release和retain是成對存在的。我們在retain引用結束後一定記得release。
還有就是我們其實也可以讓系統為我們自動釋放記憶體[[[Fraction alloc] init] autorelease],但我們最好還是手動來管理記憶體,因為這樣會更加高效,系統管理相當於將我們的記憶體位址加入到一個集合中,隔段時間進行掃描,這樣遠遠沒有我們手動管理效率高。
這就是objective-c的一些個人理解,希望大家給予指點