讀“編寫高質(zhì)量iOS與OSX代碼的52個有效方法”筆記(03)

內(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)存管理問題
Xcode中的Scheme編輯器

啟動這項調(diào)試功能之后,運行期系統(tǒng)會把所有已經(jīng)回收的實例轉(zhuǎn)化成特殊的“僵尸對象”,而不會真正的回收他們。這種對象所在的核心內(nèi)存無法重用,因此不可能遭到覆寫。僵尸對象收到消息后,會拋出異常,其中準確說明了發(fā)送過來的消息,并描述了回收之前的對象。

第36條:不要使用retainCount

對象的保留計數(shù)看似有用,實則不然,因為任何給定時間點上的“絕對保留技術(shù)”都無法反映對象的生命期的全貌。

但是這個其實我們一般也不會用,ARC環(huán)境下已經(jīng)禁止啦。

持續(xù)記錄中····

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容