iT邦幫忙

1

iOS APP 開發 OC 第七天, nil 跟 NULL 一樣嗎?

tags: OC 30 day

  1. NULL
    可以作為指針變量的值。如果一個指針變量的值是NULL值,代表這個指針不指向內存中的任何一個空間。
    NULL其實等價於0,NULL其實是一個宏,就是0。
  2. nil
    只能作為指針變量的值。代表這個指針變量不指向內存中的任何空間。nil其實也等價於0,也是一個宏,就是0。

所以,Null和nil是一樣的。

這兩個都是一樣的,那到底要如何使用呢?
雖然使用NULL的地方可以是nil,使用nil的地方可以是NULL,但是不建議大家隨便使用。

Null和nil什麼時候該用哪個?

C指針用NULL

int *p1 = NULL; p1指針不指向內存中的任何一個空間。

OC的類指針用nil

Person *p1 = nil; p1指針不指向任何對象。

如果一個類指針的值為nil 代表這個指針不指向任何對象。

Person *p1 = nil;

那麼這個時候,如果通過p1指針去訪問p1指針指向的對象的屬性,這時候會運行報錯。
那麼這個時候,如果通過p1指針去調用對象的方法,運行不會報錯,但是方法不會執行,沒有任何反應。

如果多個指針指向同一個對象?

  1. 同類型的指針變量之間是可以相互賦值的。
Person *p1 = [Person new];
Person *p2 = p1; 這是完全沒有問題的,p1和p2的類型都是Person指針類型的。

代表將p1的值賦值給p2,而p1的值是對象的位址,所以就把對象的地址賦值給了p2。
所以p1和p2指向了同一個對象。
無論透過p1還是p2其實修改的都是同一個對象。
2. 目前為止,只要看見了new,就說明創建了一個新的對象。


1 則留言

1
ytyubox
iT邦新手 5 級 ‧ 2020-12-29 12:29:17

補充
NULL 是 (void *) 0 ,這個與 0 (自動型別推斷,有明確的不同,參考 https://nshipster.com/nil/

我要留言

立即登入留言