我們都知道铣口,在IOS開發(fā)的過程中,我們需要創(chuàng)建大量的對象觉壶,這些對象被存儲在堆上脑题,而系統(tǒng)并不會自動釋放堆中的內(nèi)存,(需要注意:基本類型是由系統(tǒng)自己管理的铜靶,是放在棧上的)叔遂。如果被創(chuàng)建的對象在使用完畢后沒有及時釋放掉,將會占用大量的內(nèi)存争剿。在其他的高級語言中已艰,比如說C#,Java等蚕苇,都是通過垃圾回收機制(CG)解決這個問題的哩掺。但是在Objc中并沒有類似于的垃圾回收機制,早起的內(nèi)存管理是在MRC環(huán)境下進行的涩笤,所以工程的內(nèi)存管理就需要開發(fā)人員手動進行管理疮丛。
【注意】在Xcode4.2及之后的版本中,由于引用了ARC機制辆它,程序在編譯時,Xcode可以自動給代碼添加內(nèi)存釋放代碼履恩,相信現(xiàn)在絕大多數(shù)人得Xcode版本都比4.2高锰茉,所以,要想充分理解Objc的內(nèi)存回收機制切心,需要大家手動關(guān)閉工程的ARC飒筑,否則片吊,如果在ARC環(huán)境下進行手動釋放,工程會報錯的协屡;
首先俏脊,內(nèi)存釋放的原則:因為對象的引用有時候過于錯綜復(fù)雜,對象之間有可能會相互交叉引用肤晓,為避免這種情況爷贫,需要遵循“誰創(chuàng)建,誰釋放”的原則补憾;
其次漫萄,是Objc內(nèi)存管理方法:
內(nèi)存管理的原理:當我們在工程中實例化一個對象之后,通常會有一個變量來引用這個對象盈匾,當這個引用變量不在使用的時候腾务,這時候就需要將此對象釋放掉,簡單的說就是:當一個對象沒有被任何變量引用時削饵,就將其回收岩瘦;
1、引用計數(shù)器
什么是引用計數(shù)器呢窿撬?就是在Objc中启昧,每個對象內(nèi)部都有一個與之對應(yīng)的整數(shù),這個整數(shù)就是“引用計數(shù)器”尤仍,當一個對象在創(chuàng)建之后箫津,他的引用計數(shù)器為1,當調(diào)用這個對象的alloc宰啦、retain苏遥、new、copy方法之后赡模,引用計數(shù)器會在原來的基礎(chǔ)上進行加1田炭,(在Objc中,調(diào)用一個對象方法就是給這個對象發(fā)送一個消息)漓柑,當調(diào)用這個對象的release方法之后教硫,它的引用計數(shù)會減1,如果一個對象的引用計數(shù)器為0辆布,則系統(tǒng)就會自動調(diào)用這個對象的dealloc 方法來銷毀這個對象瞬矩。在代碼中,一般使用dealloc方法來查看一個對象是否被回收锋玲,如果沒有被回收景用,則有可能會造成內(nèi)存泄露。如果確認一個對象已經(jīng)被釋放惭蹂,那么最后需要將他的變量手動設(shè)置為nil伞插,否則可能會造成野指針錯誤割粮,需要注意的是,在Objc中媚污,給空對象發(fā)送消息是不會報錯的舀瓢;
2、屬性參數(shù)
@property 的參數(shù)分為三類耗美;也就是說京髓,參數(shù)最多可以有三個,中間使用逗號進行分割幽歼,中間使用逗號進行分割朵锣,每類參數(shù)可以從上面三類表中選擇一個,如果不進行設(shè)置甸私,則會選用默認值诚些,默認參數(shù):atomic、readwrite皇型、assign ;如果在多線程的開發(fā)過程中诬烹,一個屬性可能被兩個及兩個以上的線程同時訪問,此時一般考慮atomic屬性弃鸦,否則建議使用nonatomic绞吁,不加鎖,效率高唬格;這里特別的說明一下set方法家破,其中,assign购岗,用于基本數(shù)據(jù)類型汰聋;retain,通常用于非字符串對象喊积;copy通常使用與字符串對象烹困、block對象、NSArray乾吻、NADictionary對象等髓梅;
3.自動釋放池
在Objc中,有一種內(nèi)存釋放的機制叫做“自動用于計數(shù)”(或“自動釋放池”)绎签,自動釋放池使用@autoreLease關(guān)鍵字聲明一個代碼塊枯饿,如果一個對象在初始化時,調(diào)用了autorelease方法诡必,那么在執(zhí)行完代碼塊之后鸭你,該對象就會自動調(diào)用一次release方法,這樣就起到了自動釋放的作用。
最后袱巨,自動釋放池的小總結(jié):
1、autorelease方法不會改變對象的引用計數(shù)碳抄,只是將這個對象添加到自動釋放池中愉老;
2、自動釋放池的實質(zhì)是當自動釋放池銷毀后剖效,統(tǒng)一調(diào)用一次對象的release方法嫉入,但不能保證該對象一定被銷毀掉;
3璧尸、由于自動釋放池最后統(tǒng)一銷毀對象咒林,因此,如果一個操作比較占用內(nèi)存爷光,最好不要放在自動釋放池中盡心銷毀垫竞。
4、Objc中蛀序,類庫中的靜態(tài)方法并不需要手動盡心釋放欢瞪,內(nèi)部已經(jīng)調(diào)用了autorelease方法;