Der Argumenttyp für error:
ist NSError**
(d. h. ein -Zeiger für einen Zeiger auf ein Objekt). Dadurch kann das Objekt moc
ein neues Objekt NSError
nach Bedarf zuweisen und initialisieren. Es ist ein allgemeines Muster, besonders in Cocoa.
Die NSError-Dokumentation gibt ein Hinweis auf die Motivation für diesen Ansatz:
Anwendungen können Unterklassen von NSError erstellen, um bessere lokalisierte Fehlerzeichenfolgen durch Überschreiben von lokalisierteBeschreibung .
Wenn Sie ein Argument NSError**
übergeben, kann diese Methode jede Unterklasse von NSError
zurückgeben, die Sinn macht. Wenn Sie in NSError*
übergeben haben, müssten Sie ein vorhandenes NSError
-Objekt angeben, und es gibt keine Möglichkeit, dass die Methode ein anderes -Objekt von dem übergebenen zurückgibt.
Um klar zu sein, könnte die Methode in etwa so aussehen:
%Vor% Beachten Sie, dass der aufrufende Code auch Fehler ignorieren kann, indem Sie einfach wie folgt NULL
für den Parameter error:
übergeben:
Update: (als Antwort auf Fragen):
Es gibt zwei Gründe, warum der Argumenttyp NSError**
anstelle von NSError*
sein muss: 1. variable Bereichsregeln und 2. NSError-Instanzen sind unveränderbar.
Grund # 1: Regeln für den Gültigkeitsbereich des Gültigkeitsbereichs
Nehmen wir an, dass die Funktionsdeklaration so aussehen sollte:
%Vor%Und wir sollten die Funktion so nennen:
%Vor% Wenn Sie eine Variable auf diese Weise übergeben, kann der Funktionskörper den Wert dieser Variablen nicht ändern (dh der Funktionskörper kann keine neue Variable als Ersatz für die Variable erstellen) existierende). Beispielsweise sind die folgenden Variablenzuweisungen nur im lokalen Bereich der Funktion vorhanden. Der aufrufende Code wird weiterhin error == nil
sehen.
Grund # 2: Instanzen von NSError sind unveränderlich
Lassen Sie uns die gleiche Funktionsdeklaration beibehalten, aber rufen Sie die Funktion wie folgt auf:
%Vor% Erstens garantieren die Regeln für den variablen Bereich, dass error
nicht nil
sein kann, so dass die Bedingung if (error != nil) { ...
immer wahr ist, aber auch wenn Sie nach spezifischen Fehlerinformationen in if
suchen möchten. Blockieren, Sie wären Pech, weil Instanzen von NSError
unveränderlich sind. Dies bedeutet, dass sie nach der Erstellung nicht mehr geändert werden können, sodass die Funktion domain
oder userInfo
der NSError
-Instanz, die Sie im aufrufenden Code erstellt haben, nicht ändern kann.
Es ist effektiv ein anderer Rückgabewert. Der Fehler ist in Cocoa nicht durch Konvention dominant, wenn ein Rückgabewert für die Operation vorhanden ist. Wenn ein Fehler auftritt, kann er von diesem out-Parameter zurückgegeben werden.
Im Falle von NSError
funktioniert das so, weil NSError
nicht ein veränderbarer Typ ist - seine Felder werden bei der Initialisierung gesetzt und nie mutiert. Daher können Sie wie üblich nicht NSError
übergeben und den Fehlercode festlegen.
Tags und Links objective-c iphone ios pass-by-reference nserror