warum der Typ von "nil" nicht "id" ist, sondern "void *"

In diesem Code

id (^block)(void) = ^(void) {
    return nil;
};

Ich habe diesen Fehler

Inkompatible Blockzeigertypen, die 'id (^ __ strong) (void)' mit einem Ausdruck vom Typ 'void * (^) (void)' initialisieren

Also muss ich explizit besetzennil zuid Art

id (^block)(void) = ^(void) {
    return (id)nil;
};

Compiler glücklich machen. Kaufen Sie warumnil ist nichtid Art?

Und für diesen Code

__typeof__(nil) dummy;
dummy = [NSObject new];

Die implizite Konvertierung des Objective-C-Zeigertyps 'NSObject *' in den C-Zeigertyp 'typeof (((void *) 0))' (auch bekannt als 'void *') erfordert eine Überbrückung

welches sagtnil ist(void *)0, ist aber nicht gleichNULL? Ich abernil sollte sein(id)0 undNil sollte sein(Class)0?

Ich benutze Xcode 4.6.2

Compiler: Apple LLVM Version 4.2 (clang-425.0.28) (basierend auf LLVM 3.2svn)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage