Unterschied zwischen nullable, __nullable und _Nullable in Objective-C
Mit Xcode 6.3 es wurden neue annotations eingeführt, um besser mit dem Ausdruck der Absicht, die API ist in Objective-C (und damit eine bessere Rasche Unterstützung natürlich). Diese Anmerkungen wurden natürlich nonnull
nullable
und null_unspecified
.
Aber mit Xcode 7, es gibt eine Menge von Warnungen erscheinen wie:
Zeiger fehlt, ist ein null-Zulässigkeit Typ Bezeichner (_Nonnull, _Nullable oder _Null_unspecified).
Zusätzlich zu, dass Apple verwendet eine andere Art von Bezeichner null-Zulässigkeit, Kennzeichnung Ihren C-code (Quelle):
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
So, in der Summe haben wir jetzt diese 3 verschiedenen null-Zulässigkeit Anmerkungen:
nonnull
nullable
null_unspecified
_Nonnull
_Nullable
_Null_unspecified
__nonnull
__nullable
__null_unspecified
Obwohl ich weiß, warum und wo die Anmerkung, ich bin immer etwas verwirrt, welche Art von Anmerkungen sollte ich verwenden, wo und warum. Dies ist, was ich sammeln konnte:
- Für Eigenschaften sollte ich verwenden
nonnull
nullable
null_unspecified
. - Für die Parameter der Methode, die ich verwenden sollte
nonnull
nullable
null_unspecified
. - Für C-Methoden, die ich verwenden sollte
__nonnull
__nullable
__null_unspecified
. - Für andere Fälle, wie Doppel-Zeiger sollte ich verwenden
_Nonnull
_Nullable
_Null_unspecified
.
Aber ich bin immer noch verwirrt, warum wir so viele Anmerkungen, die im Grunde das gleiche tun.
Also meine Frage ist:
Was ist der genaue Unterschied zwischen diesen Anmerkungen, wie Sie sich richtig zu platzieren und warum?
InformationsquelleAutor der Frage Legoless | 2015-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der
clang
Dokumentation:und
Also für die Methode gibt, und Parameter, die Sie verwenden können, die
die Doppel-Unterstrich-Versionen
__nonnull
/__nullable
/__null_unspecified
statt den single-Unterstrichen, oder anstelle von nicht-Unterstrichen lieben. Der Unterschied ist, dass die Einzel-und Doppel Unterstrichen diejenigen, die platziert werden müssen, nachdem die Typ-definition, während die nicht-Unterstrichen diejenigen, die platziert werden müssen, bevor der Typ-definition.Somit die folgenden Deklarationen sind gleichwertig und richtig sind:
Parameter:
Eigenschaften:
Dinge jedoch erschweren wenn ein Zeiger oder Blöcke zurückgeben, etwas anderes als void beteiligt sind, wie die nicht-Unterstrich sind nicht erlaubt, hier:
Vergleichbar mit Methoden, die Sie akzeptieren-Blöcke als Parameter, bitte beachten Sie, dass die
nonnull
/nullable
qualifier gilt für den block, und nicht seine Rückkehr geben, damit die folgenden sind äquivalent:Wenn der block einen Rückgabewert, dann bist du gezwungen in einer der Unterstrich Versionen:
Als Abschluss können Sie entweder lieben, solange kann der compiler bestimmen Sie die Artikel zuordnen, um die qualifier zu.
InformationsquelleAutor der Antwort Cristik
Vom der Swift blog:
InformationsquelleAutor der Antwort Ben Thomas
Ich mochte dieser Artikelso dass ich versuche nur, zu zeigen, was der Autor schrieb:
https://swiftunboxed.com/interop/objc-nullability-annotations/
null_unspecified:
Brücken zu einer raschen implizit unwrapped optional. Dies ist die Standard.nonnull
: der Wert ist nicht null; Brücken zu einem regelmäßigen Bezug.nullable
: der Wert kann null; Brücken optional.null_resettable
: der Wert nie null, wenn Sie Lesen, aber Sie können setzen Sie ihn auf null zurückzusetzen. Gilt nur Eigenschaften.Den Notationen vor, dann unterscheiden sich, ob Sie diese in der Kontext von Eigenschaften oder Funktionen/Variablen:
Der Autor des Artikels auch ein schönes Beispiel:
InformationsquelleAutor der Antwort kgaidis
Sehr praktisch ist
und schließen mit
Diese wird zunichte machen, die Notwendigkeit für die code-Ebene 'nullibis' 🙂 wie es Art von Sinn macht, anzunehmen, dass alles ist nicht null (oder
nonnull
oder_nonnull
oder__nonnull
) sofern nicht anders angegeben.Leider gibt es Ausnahmen von dieser als gut...
typedef
s sind nicht davon ausgegangen, dass__nonnull
(beachten Sie, dassnonnull
scheint nicht zu funktionieren, verwenden es ist hässlich Halbbruder)id *
Bedarf einer expliziten nullibi aber wow die sin-Steuer (_Nullable id * _Nonnull
<- erraten, was das bedeutet...)NSError **
ist immer davon ausgegangen, nullableAlso mit den Ausnahmen von den Ausnahmen und die inkonsistente keywords entlocken die gleiche Funktionalität, vielleicht der Weg ist das hässliche Versionen
__nonnull
/__nullable
/__null_unspecified
- und swap-wenn der complier beschwert sich... ? Vielleicht ist das, warum Sie existieren in der Apple-Header?Interessanterweise etwas, das es in meinem code... ich verabscheue unterstreicht code (old school Apple C++ - Stil Kerl) also ich bin absolut sicher, dass ich nicht diese Art, aber Sie erschien (ein Beispiel von mehreren):
Und noch interessanter, wo es eingefügt __nullable ist falsch... (eek@!)
Ich wünschte wirklich, ich könnte einfach die nicht-Unterstrich-version aber anscheinend nicht Fliegen mit dem compiler als dieses gekennzeichnet, als ein Fehler:
InformationsquelleAutor der Antwort William Cerniuk