IOS中內(nèi)存采用引用計數(shù)的方式,在釋放內(nèi)存編程時采用約定的方式,在這里不長篇大論具體內(nèi)存的原理,只從實用角度出發(fā)記錄下如何根據(jù)這些約定來釋放內(nèi)存。
具體約定為:
當你使用new、alloc、copy 開頭的方法名創(chuàng)建對象后,當不需要此對象時,需要通過調(diào)用這個對象的release方法來減少引用計數(shù);retain對象之后也需要調(diào)用release方法來減少引用計數(shù)。
其它方法創(chuàng)建的對象都不需要調(diào)用release方法來釋放對象。
只要記住這條約定,編程中80%的內(nèi)存管理都不需要再考慮是否需要release還是不需要了。
當你自己的方法中不是以new、alloc 或 copy 開頭的方法名創(chuàng)建對象時,可以使用 autolease返回對象,這樣調(diào)用者就不需要釋放對象了。
在程序中跟內(nèi)存相關(guān)的需要注意的地方為:
@PRoperty (nonatomic, retain) UILabel* label;@property (nonatomic, assign) NSInteger intValue; @synthesize label = _label;
其中對于對象類型使用了retain,這樣這個對象就需要被release,release的地方為dealloc方法內(nèi)。
對于基本數(shù)據(jù)類型,使用了assign,也就是直接賦值方式就可以,不存在對象引用計數(shù)這種問題,因此也就不需要release。
在合成方法時,這里采用了一個變量名約定,也就是_變量名,這樣帶下劃線的變量就是內(nèi)部變量,而沒有下劃線的其實就是屬性名,這樣真正的內(nèi)部變量其實是帶下劃線的那個名字,因此在釋放內(nèi)存時就要使用_變量名.release方法。
- (void)viewDidUnload{self.label = nil;[super viewDidUnload];}
這里主要是對retain修飾的屬性進行釋放,只要把相關(guān)屬性設(shè)置為nil就可以,(主要原因是在生成設(shè)置屬性的代碼中就有對原有對象的釋放)
- (void)dealloc{[_label release];[super dealloc];}
新聞熱點
疑難解答
圖片精選