en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

8.29.2011

Objective-C 的 Nil、nil 與 NULL

在 Objective-C 程式語言中,設定參數或是條件判斷時常常會使用 Nil、nil 與 NULL,雖然說他們的意思都是空 Empty 的意思,但是這三者意指的卻是完全不同的東西,以下是 Objective-C 給它們的定義。

#define Nil __DARWIN_NULL /* id of Nil class */
#define nil __DARWIN_NULL /* id of Nil instance */

#define __DARWIN_NULL ((void *)0)

#define NULL ((void*)0)

按照上述程式碼定義的說法,它們三者全都指向 ((void*)0) 一個空值的指標,但是 Objective-C 可不希望你拿來混著隨便亂用,至於什麼時候該使用哪一個來表示空值,我們引用技術文件中的一小段話來說明。

The difference is that while NULL represents zero for any pointer, nil is specific to objects (e.g., id) and Nil is specific to class pointers.

正常來說 nil,它所指的是一個物件對象,而這個對象的指標指向空 Empty,而 Nil 則是用來區別所指向的對象是一個類別 Class 而非物件,NULL 則指的是任何指向空值的指標(我們姑且可以想成當作一個數值來使用)。

如果你還是不清楚,可以參考下面的程式碼示範。
- (IBAction)onButton:(id)sender {

NSLog(@"hi");
}

上述程式碼是一個按鈕事件,如果將此事件與按下按鈕的動作做連結時,當使用者按下按鈕,在 Console 就會出現 hi 的字串。

現在我們想直接透過程式碼來呼叫此事件,由於並沒有經由按鈕來觸發,因此必須將輸入的參數設為空值。

[self onButton:nil];
上述程式碼,因為 id 在 Objective-C 裡被定義為泛指所有物件型態,因此在指定空值時我們使用 nil。

當然你也可以將 nil 替換成 NULL,只是比較不妥當,最糟的作法就是將 nil 替換成 Nil, 雖然說在編譯上並不會出現任何問題,但是卻失去了 Objective-C 嚴謹定義下的初衷。







4 則留言:

  1. 匿名6/09/2012

    GOOD
    對新手有幫助!

    回覆刪除
    回覆
    1. 感謝您的支持與愛護。

      刪除
  2. 非常清楚,謝謝!

    回覆刪除
    回覆
    1. cg2010studio 您好:

      不用客氣!

      刪除