IOS開發筆記12-Object-C中的物件與記憶體
阿新 • • 發佈:2019-02-15
前言
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,或者銷燬它的指標。