2009-02-17 18 views
176

W observeValueForKeyPath:ofObject:change:context: - dlaczego dokumenty używają NULL zamiast nil, gdy nie określa się wskaźnika kontekstowego?NULL vs zero w Objective-C

+0

moim zdaniem obiekt jest zerowy, klasa jest zerowa i NULL jest używana dla obiektu lub klasy –

Odpowiedz

221

nil powinien być używany tylko w miejsce id, co my, programiści Java i C++, uważalibyśmy za wskaźnik do obiektu. Użyj NULL dla wskaźników nieobiektowych.

Look w deklaracji tej metody:

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

Kontekst jest void * (czyli wskaźnik C-style), więc na pewno chcesz używać NULL (co jest czasami zadeklarowane jako (void *)0) zamiast nil (który jest typu id).

+2

Ale ponieważ typ 'context' w' observeValueForKeyPath: ofObject: change: context: 'to' void * ', czy to nie oznacza, że ​​dane przekazane jako' context' mogą być wskaźnikami obiektów? Sądzę, że jest to powszechny przypadek. Właśnie dlatego jestem zdezorientowany, dlaczego docs zawsze używają 'NULL' zamiast' nil'. – erikprice

+2

Rodzaj kontekstu: w tej metodzie jest "void *". "zero" nie jest "void *", ale NULL jest. –

+0

Czy można zatem wywnioskować z tej dyskusji, że * nie możemy * przekazać wskaźnika obiektu (aka, coś, co można wpisać jako 'nil'), gdy przekazujemy tę wiadomość do obiektu implementującego NSKeyValueObserving? Ponieważ wskaźniki obiektów nie mogą być typu "void *"? – erikprice

63

Są technicznie to samo (0), ale zero jest zwykle używane dla obiektu typu Objective-C, a NULL dla wskaźników w stylu C (void *).

+8

Ponadto, 'NULL' jest inaczej zdefiniowany niż' zero'. 'nil' jest zdefiniowane jako' (id) 0'. 'NULL' nie jest. –

+14

@WTP, jeśli czytasz przez MacTypes.h, deklaruje #define zero NULL – jbat100

+1

To jest bardzo interesujące. Wygląda na to, że nie ma to większego znaczenia niż punkty styli. To jest jak TAK/PRAWDA i NIE/FAŁSZ. – Brennan

50

Są technicznie to samo i różnią się jedynie w stylu:

  • Objective-C styl mówi nil co użyć do id typu (i wskaźniki do obiektów).
  • Styl C mówi, że NULL jest tym, czego używasz dla void *.
  • Styl C++ zazwyczaj mówi, że powinieneś po prostu użyć 0.

Zazwyczaj używam wariantu, który odpowiada językowi, w którym typ jest zadeklarowany jako.

+6

C++ 11 teraz używa nullptr zamiast 0 dla wskaźników zerowych –

10

NULL jest C equivalent z nil, wskaźnik do niczego;

gdzie nil is zero typed as id,

NULL is zero typed as void*.

Jeden ważny punkt nie można wysłać wiadomość do NULL. Dlatego w wielu miejscach preferowane jest używanie zer w celu-C.

3

one prawie to samo z wyjątkiem

nil stosowany jest w stylu Objective-C. , gdzie NULL jest dla wskaźników typu C i jest wpisany jako (void *).

+1

Czy to nie jest powtórka z [tej istniejącej odpowiedzi] (http://stackoverflow.com/questions/557582/null-vs-nil-in- cel-c/557607 # 557607)? – Pang

Powiązane problemy