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
Odpowiedz
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
).
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
Rodzaj kontekstu: w tej metodzie jest "void *". "zero" nie jest "void *", ale NULL jest. –
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
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 *).
Ponadto, 'NULL' jest inaczej zdefiniowany niż' zero'. 'nil' jest zdefiniowane jako' (id) 0'. 'NULL' nie jest. –
@WTP, jeśli czytasz przez MacTypes.h, deklaruje #define zero NULL – jbat100
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
Są technicznie to samo i różnią się jedynie w stylu:
- Objective-C styl mówi
nil
co użyć doid
typu (i wskaźniki do obiektów). - Styl C mówi, że
NULL
jest tym, czego używasz dlavoid *
. - 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.
C++ 11 teraz używa nullptr zamiast 0 dla wskaźników zerowych –
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.
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 *)
.
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
moim zdaniem obiekt jest zerowy, klasa jest zerowa i NULL jest używana dla obiektu lub klasy –