1. 程式人生 > >IOS開發筆記12-Object-C中的物件與記憶體

IOS開發筆記12-Object-C中的物件與記憶體

前言

Object-C的記憶體管理機制與java那種全自動的垃圾回收機制是不同的,它本質上還是c語言的手動管理方式,只不過稍微加了一些自動方法。

指標和指標的值

以下程式宣告一個指向NSDate例項的變數:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSDate *today=nil;

        NSLog(@"%p",today);
    }
    return
0; }

初始化指標變數為nil,程式輸出0x0,這時在棧中的today變數值為0x0,而在堆上沒有任何物件。

繼續看下面例項:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSDate *today=[NSDate date];

        NSLog(@"%p",today);
    }
    return 0;
}

這時建立了一個NSDate例項,today指向這個例項,不再指向nil。堆上面儲存著一個NSDate物件。

記憶體管理

棧是由有序的幀構成的,函式的幀在函式結束後會自動釋放,而堆裡的物件不會自動釋放。因此管理堆很重要,程式佔用堆大小是有限的。而每個物件被建立後都會佔用一定的堆記憶體,如果系統記憶體不足,mac應用的執行效果就會變差,而ios應用就會崩潰。

當堆中的物件沒有被引用,這時就應該銷燬。

自動銷燬不被引用的物件的機制稱為ARC,ARC是自動引用計數的簡稱。每個物件都會對指向自己的指標進行計數,當引用計數為0時,就會認為不需要該物件了。如果專案開啟了ARC,編譯器會自動給專案新增程式碼來計算每個物件的引用數。

只要有一個指標指向物件,這個物件就會繼續存在。因此呼叫free()函式來銷燬物件是清理最乾淨的方法。如果不再需要某個物件,則可以將指向它的指標設定成nil,或者銷燬它的指標。