內(nèi)存管理
第29條:理解引用計數(shù)
Objective-C 語言使用引用計數(shù)器來管理內(nèi)存,每個對象都有個可以遞增或遞減的計數(shù)器。對象創(chuàng)建好之后,其保留計數(shù)至少為1,若保留計數(shù)為正,則對象繼續(xù)存活,當保留計數(shù)降為0時,對象被銷毀。
在對象的生命周期中,其余對象通過引用來保留或釋放此對象。保留或釋放操作分別會遞增或遞減保留計數(shù)。
注意retain,release,autorelease,這三個方法操作計數(shù)器。
第30條:以ARC簡化引用計數(shù)
ARC,即自動管理計數(shù)器。
在ARC中,變量的內(nèi)存管理語義可以通過修飾符指明,而原來則需手工執(zhí)行”保留“及釋放操作;(__strong,__weak,一個保留值,一個不保留值)。
注意的是ARC只負責管理Objective-C對象的內(nèi)存。注意:CoreFoundation對象不歸ARC管理,必須適時調(diào)用CFRetain/CFRelease
第31條:在dealloc中只釋放引用并解除監(jiān)聽
- (void)dealloc
{
// CFRelease(COREFOUNDATIONObject);
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
第32條:編寫”異常安全代碼“時留意內(nèi)存管理問題
@try {
// 可能會出現(xiàn)崩潰的代碼
}
@catch (NSException *exception) {
// 捕獲到的異常exception
}
@finally {
// 結(jié)果處理,也可以去掉
}
簡單的來說,
Apple雖然同時提供了錯誤處理NSError)和異常處理(exception)兩種機制,但是Apple更加提倡開發(fā)者使用NSError來處理程序運行中可恢復的錯誤。而異常被推薦用來處理不可恢復的錯誤。
第33條:以弱引用避免保留環(huán)
保留環(huán)也就是我們常說的循環(huán)引用。就是有時候我們需要將某些引用設(shè)為
weak,可避免出現(xiàn)“保留環(huán)”。
第34條:以”自動釋放池塊“降低內(nèi)存峰值
自動釋放池用于存放那些需要在稍后某個時刻釋放的對象。
NSArray * dataRecord = /*****/;
NSMutableArray * testPeopleArray = [NSMutableArray array];
for(NSDictionary * recordDic in dataRecord)
{
TestPeople * people = [[TestPeople alloc] initWithRecord:recordDic];
[testPeopleArray addObject:people];
}
當循環(huán)長度無法預估,需要讀出很多對象的時候,像上面中,會有一些臨時對象產(chǎn)生,內(nèi)存中會有很多不必要的臨時對象,他們本該提早回收的,增加一個釋放池就好啦。
NSArray * dataRecord = /*****/;
NSMutableArray * testPeopleArray = [NSMutableArray array];
for(NSDictionary * recordDic in dataRecord)
{
@autoreleasepool {
TestPeople * people = [[TestPeople alloc] initWithRecord:recordDic];
[testPeopleArray addObject:people];
}
}
注意不要把for循環(huán)放到釋放池里面,特別是循環(huán)長度特別長的時候。
第35條:用”僵尸對象“調(diào)試內(nèi)存管理問題

啟動這項調(diào)試功能之后,運行期系統(tǒng)會把所有已經(jīng)回收的實例轉(zhuǎn)化成特殊的“僵尸對象”,而不會真正的回收他們。這種對象所在的核心內(nèi)存無法重用,因此不可能遭到覆寫。僵尸對象收到消息后,會拋出異常,其中準確說明了發(fā)送過來的消息,并描述了回收之前的對象。
第36條:不要使用retainCount
對象的保留計數(shù)看似有用,實則不然,因為任何給定時間點上的“絕對保留技術(shù)”都無法反映對象的生命期的全貌。
但是這個其實我們一般也不會用,ARC環(huán)境下已經(jīng)禁止啦。
持續(xù)記錄中····