Im C ist die Definition von NULL 0, und in Objective-C wird NO auf FALSE aliasert, was wiederum auf 0 aliasiert ist, daher ist das Rückgeben von NULL im Grunde dasselbe wie das Rückgeben von NO.
Das Problem ist, wie in der Dokumentation angegeben:
Diese Methode wird aufgerufen, bevor ein Authentifizierungsversuch unternommen wird.
Wenn Sie NO zurückgeben, konsultiert die Verbindung den Anmeldeinformationenspeicher nicht automatisch und speichert keine Anmeldeinformationen. Sie können jedoch in Ihrer connection:didReceiveAuthenticationChallenge: Methode den Anmeldeinformationenspeicher selbst konsultieren und bei Bedarf Anmeldeinformationen speichern.
Das Nichtimplementieren dieser Methode ist dasselbe wie das Zurückgeben von YES.
Statt NULL zurückzugeben, gibt es YES gemäß der Standardimplementierung zurück.
EDIT: NO
ist auf (BOOL)0
aliasiert, nicht auf false
, das ein echter boolescher Typ ist
Speziell die Definitionen von YES
/NO
befinden sich in objc.h
typedef signed char BOOL;
// BOOL ist explizit signiert, so dass @encode(BOOL) == "c" statt "C" ist, selbst wenn -funsigned-char verwendet wird.
#define OBJC_BOOL_DEFINED
#define YES (BOOL)1
#define NO (BOOL)0
EDIT: Wie unten in den Kommentaren von @AminNegm-Awad angemerkt wurde, ist meine Erklärung des NULL-Werts nur eine (wahrscheinlich zu einfache), da 0 zwar seine endgültige Auswertung ist, aber nicht sein tatsächlicher Wert.
/*
* Typdefinitionen; enthält gemeinsame Typdefinitionen, die aufgrund von [XSI] in mehreren Headerdateien verwendet werden müssen, entfernt sie aus dem Systemraum und platziert sie im Implementierungsraum.
*/
#ifdef __cplusplus
#ifdef __GNUG__
#define __DARWIN_NULL __null
#else /* ! __GNUG__ */
#ifdef __LP64__
#define __DARWIN_NULL (0L)
#else /* !__LP64__ */
#define __DARWIN_NULL 0
#endif /* __LP64__ */
#endif /* __GNUG__ */
#else /* ! __cplusplus */
#define __DARWIN_NULL ((void *)0)
#endif /* __cplusplus */
Tatsächlich kann man in nachschlagen und feststellen, dass __DARWIN_NULL
im Objekt-C-Code zu ((void *)0)
ausgewertet wird (nachprüfbar durch Schreiben von __DARWIN_NULL
in Xcode und Klicken bei cmd), daher aus dem Kommentar von @AminNegm-Awad:
Ein ganzzahliger Konstantenausdruck mit dem Wert 0 oder ein solcher Ausdruck, der in den Typ void * überführt wird, wird als Nullzeigerkonstante bezeichnet. Wenn eine Nullzeigerkonstante in einen Zeigertyp umgewandelt wird, ist der resultierende Zeiger, genannt Nullzeiger, garantiert ungleich einem Zeiger auf ein Objekt oder eine Funktion." Als ganze Zahl beträgt 0 (Nullzeigerkonstante). Wenn es ein Zeiger ist, ist es das Umwandeln von 0 in einen Zeiger.
In einer C++-Anwendung wird __DARWIN_NULL
stattdessen zu __null
, einem internen Compiler.
ZURÜCK ZUR FRAGE:
Der Proxy-Delegate-Ansatz erscheint mir als sauberer Ansatz, insbesondere wenn Sie einige der NSURLConnectionDelegate
-Methoden ausblenden möchten. Der Ansatz ist mehr oder weniger derselbe für -(void)
-Methoden, der Unterschied besteht darin, dass Sie nichts zurückgeben müssen, sondern einfach die delegierte Methode aufrufen müssen. Ich kann Ihnen jetzt kein vollständiges Beispiel liefern, aber heute Abend werde ich etwas posten