NULL vs zero w Objective-C

182

W observeValueForKeyPath:ofObject:change:context:- dlaczego dokumenty używają NULLzamiast nilnie określać wskaźnika kontekstu?

erikprice
źródło
moim zdaniem, obiekt jest zerowy, klasa zerowa, a NULL używa dla obiektu lub klasy
Thanh Vũ Trần

Odpowiedzi:

227

nilpowinno się go używać zamiast zamiast tego id, co my, programiści Java i C ++, uważalibyśmy za wskaźnik do obiektu. Posługiwać sięNULL do wskaźników niebędących obiektami.

Spójrz na deklarację tej metody:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context

Kontekst jest void *(tzn. Wskaźnikiem w stylu C), więc zdecydowanie użyłbyś NULL(co czasem jest deklarowane jako (void *)0) zamiast nil(który jest typu id).

Paul Tomblin
źródło
2
Ale ponieważ typ contextna observeValueForKeyPath:ofObject:change:context:to void *, że nie oznacza to, że dane przekazywane jak contextmoże być wskaźnik obiekt? Myślę, że to częsty przypadek. Dlatego jestem zdezorientowany, dlaczego dokumenty zawsze używają NULLzamiast nil.
erikprice
2
Typ kontekstu: w tej metodzie jest „void *”. „zero” nie jest „pustką *”, ale NULL jest.
Paul Tomblin
3
Możesz. void * to dowolny wskaźnik. Niemniej jednak masz całkowitą rację, że NULL jest tam poprawną stałą.
Peter Hosey
3
Powiedzieli, że nieważne *. NULL jest dla void *, a zero dla id. Dlatego zdajesz NULL. Jeśli zdasz zero, okłamujesz swojego czytelnika, który pomyśli, że ta metoda przyjmuje identyfikator.
Peter Hosey
12
Albo inaczej: NULL jest szerszym typem, a zero jest podzbiorem NULL. Zasadniczo używaj najszerszego rodzaju, z którego możesz uciec (tj. W Javie, napisz swoją metodę, aby spodziewać się Kolekcji zamiast Vector, chyba że potrzebujesz czegoś konkretnego z Vector)
Paul Tomblin
65

Są one technicznie takie same (0), ale zero jest zwykle używane dla typu obiektu Objective-C, podczas gdy NULL jest używane dla wskaźników typu c (void *).

Marc Charbonneau
źródło
8
Ponadto NULLjest inaczej zdefiniowany niż nil. niljest zdefiniowany jako (id)0. NULLnie jest.
14
@WTP, jeśli czytasz przez MacTypes.h, deklaruje #define nil NULL
jbat100 27.11.11
1
To jest bardzo interesujące. Wygląda na to, że nie ma to znaczenia innego niż punkty stylowe. To jak TAK / PRAWDA i NIE / FAŁSZ.
Brennan
1
@Brennan, To nie do końca prawda, tylko dlatego, że zero jest zdefiniowane jako NULL, nie oznacza, że ​​za kulisami kryje się inna ukryta implementacja. Na przykład IBAction jest zdefiniowane jako nieważne, ale ma inne znaczenie, gdy używa się konstruktora interfejsów podczas wyświetlania metod dołączania do akcji na przyciskach i tym podobnych.
Micaiah Wallace
53

Są technicznie takie same i różnią się tylko stylem:

  • Styl Objective-C mówi, nilczego użyć doid typu (i wskaźników do obiektów).
  • Styl C mówi, że NULLwłaśnie tego używaszvoid * .
  • Styl C ++ zazwyczaj mówi, że powinieneś po prostu użyć 0.

Zazwyczaj używam wariantu, który pasuje do języka, w którym deklarowany jest typ .

Andrzej
źródło
14

NULLjest C equivalentod nil, wskaźnik do niczego;

gdzie nil is zero typed as id,

NULL is zero typed as void*.

Jedną ważną kwestią , której nie możesz wysłać do NULL. Dlatego w wielu miejscach preferowane jest użycie wartości zero w celu C.


źródło
4

Są prawie takie same, z wyjątkiem:

niljest używany w stylu Objective-C. gdzie NULLjest dla wskaźników typu C i jest typdef'ed do (void *).

dan14941
źródło
1
Czy to nie jest powtórzenie istniejącej odpowiedzi ?
Pang