天天看點

記憶體管理

過渡釋放

現象:當寫完和記憶體引用計數-1有關的操作後,程式馬上crash.

原因:空間被系統回收之後,不能再做和引用計數-1有關的操作,否則馬上crash

解決方式:删除

當引用計數為零時,系統會自己主動回收記憶體,我們僅僅管理引用計數.

野指針異常:

現象:可能會崩潰,也可能不會崩潰,寫到某一行代碼時突然崩潰.(沒有寫不論什麼和引用計數相關的代碼);

産生原因:該對象的空間已經被系統回收,不能訪問沒有全部權的對象.

解決方式:空間被系統回收以後,禁止訪問.

記憶體洩露:

現象:系統崩潰

産生原因:一直開辟空間,而不做空間回收處理.

解決方式:開辟空間的同一時候就要考慮空間的回收.

autorelease 會将聲明為autorelease的對象放入離它近期的自己主動釋放池中,當自己主動釋放池銷毀時,會向池中的每個對象發送給一個release消息.

面試題1

    @autoreleasepool {

        for (long i = 0; i < 100000000000; i++) {

            @autoreleasepool{

                Person *per = [[Person alloc]init];

                [per autorelease];

            }

        }

    }

存在的問題:沒有優化記憶體,反複開辟空間,卻沒有回收空間,會造成記憶體洩漏

面試題2

    NSString *per = [[NSString alloc]init];//0 - 1

    [per retain];//1 - 2

    [per retain];//2 - 3

    per = @"aa";

    [per release];

 存在的問題,指針變量重指向,造成記憶體洩漏,而且後面的空間回收操作無效.

 記憶體管理基本原則:

 假設你對一個對象進行了alloc,retain,copy之後,你就擁有了該對象的全部權,你就必須對它進行release或者autorelease.

當該引用對象計數為0時系統會自己主動調用dealloc方法來回收空間.該方法是由系統自己主動調用,不能手動調用.

驗證對象空間有沒有回收,僅僅要檢視該類的dealloc方法有沒有運作就可以.

記憶體管理經典分析:

遛狗原理和關燈原理

繼續閱讀