這幾天學習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)copyFraction* 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],但我們最好還是手動來管理內存,因為這樣會更加高效,系統管理相當於將我們的內存地址加入到一個集合中,隔段時間進行掃描,這樣遠遠沒有我們手動管理效率高。