標籤:嚴格 pos 支援 ack 建立 效率 c語言 release post
一、nil 、NSNull、Nil、NULL 區別
1、nil
我們給對象賦值時一般會使用object = nil,表示我想把這個對象釋放掉;
或者對象由於某種原因,經過多次release,於是對象引用計數器為0了,系統將這塊記憶體釋放掉,這個時候這個對象為nil,我稱它為“Null 物件”。(注意:我這裡強調的是“Null 物件”,下面我會拿它和“值為空白的對象”作對比!!!)
所以對於這種Null 物件,所有關於retain的操作都會引起程式崩潰,例如字典添加索引值或數組添加新原素等,具體可參考如下代碼:
2、NSNull
NSNull和nil的區別在於,nil是一個Null 物件,已經完全從記憶體中消失了,而如果我們想表達“我們需要有這樣一個容器,但這個容器裡什麼也沒有”的觀念時,我們就用到NSNull,我稱它為“值為空白的對象”。如果你查閱開發文檔你會發現NSNull這個類是繼承NSObject,並且只有一個“+ (NSNull *) null;”類方法。這就說明NSNull對象擁有一個有效記憶體位址,所以在程式中對它的任何引用都是不會導致程式崩潰的。參考代碼如下:
3、Nil
nil和Nil在使用上是沒有嚴格限定的,也就是說凡是使用nil的地方都可以用Nil來代替,反之亦然。只不過從編程人員的規約中我們約定俗成地將nil表示一個Null 物件,Nil表示一個空類。參考代碼如下:
4、NULL
我們知道Object-C來源於C、支援於C,當然也有別於C。而NULL就是典型C語言的文法,它表示一個null 指標,參考代碼如下:
int *ponit = NULL;
二、野指標,殭屍指標、殭屍對象
野指標
先來介紹一下野指標,C/C++中對野指標的定義為:野指標就是指向垃圾記憶體的指標,這個指標地址不是NULL。如果給一個指標賦值為NULL,那麼該指標就是一個null 指標,可以用if語句判讀。但是對於野指標不能用if語句判斷。
野指標產生的原因
1)指標變數沒有被初始化。任何指標在建立時都不會自動賦值為NULL,那麼如果不初始化,它指向的記憶體位址是不確定的。所以在建立時,應該進行初始化。
char *ptr = NULL;char *str = (char*)malloc(32);
2)指標被釋放(free或malloc)之後,沒有設定為NULL,誤以為是個合法指標。
void function( void ) { char* str = new char[100]; delete[] str; // Do something strcpy( str, "Dangerous!!" ); }
3)指標操作超出了變數的作用範圍。
class A { public: void Func(void){ cout << “Func of class A” << endl; }};void Test(void){ A *p; { A a; p = &a; // 注意 a 的生命期 } p->Func(); // p是“野指標”}
函數 Test 在執行語句 p->Func() 時 ,對象 a 已經消失,而 p 是指向 a 的,所以 p 就成了 “野指標”。
殭屍指標
“殭屍指標”就是野指標的一種情況,即該指標指向的對象已經被釋放,但是卻沒有對當前指標賦值為nil。
殭屍對象
簡單的來說,殭屍對象是已經被釋放的對象。如果在程式中再度使用該對象,一般會出現如下報錯:
unrecognized selector sent to instance
今天就遇到了這樣的一個報錯:
解決方案
可以在Xcode的scheme頁面中設定NSZombieEnabled環境變數。點擊Product——>Edit Scheme開啟該頁面,然後勾選Enable Zombie Objects 複選框。如所示:
NSZombieEnabled變數用來調試與記憶體有關的問題,跟蹤對象的釋放過程。啟用了NSZombieEnabled,它會用一個殭屍來替換預設的dealloc實現,也就是在引用計數降到0時,該殭屍實現會將該對象轉換成殭屍對象。殭屍對象的作用是在你向它發送訊息時,它會顯示一段日誌並自動跳入調試器。啟用NSZombie而不是讓應用直接崩潰掉時,一個錯誤的記憶體訪問就會變成一條無法識別的訊息發送給殭屍對象。殭屍對象會顯示接受到得資訊,然後跳入調試器,這樣你就可以查看到底是哪裡出了問題。
為什麼不預設開啟殭屍對象檢測呢?
因為一旦開啟,每次通過指標訪問對象的時候,都會去檢查指標指向的對象是否為殭屍對象。所以會影響程式的執行效率,建議關閉。
參考:
http://www.jianshu.com/p/2b44e1c346e7
http://www.cnblogs.com/tgycoder/p/5661431.html
iOS 中的 nil、Nil、NULL、NSNull 殭屍對象和野指標