国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

有關objective-c內存處理機制

2019-11-14 20:14:39
字體:
來源:轉載
供稿:網友

   這幾天學習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的一些個人理解,希望大家給予指點


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 铅山县| 镇赉县| 镇平县| 大名县| 牙克石市| 阿瓦提县| 三原县| 固原市| 新乡县| 岳西县| 临澧县| 义马市| 读书| 锦屏县| 荆门市| 同仁县| 禄丰县| 乐亭县| 澳门| 东山县| 海晏县| 铜陵市| 隆安县| 延川县| 游戏| 大安市| 南京市| 嫩江县| 枞阳县| 贞丰县| 建瓯市| 贵南县| 大足县| 石首市| 常州市| 绥化市| 公安县| 芒康县| 曲麻莱县| 连云港市| 新沂市|