NULL vs zero w Objective-C


182

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


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).


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 *).


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 .


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.