warum wird "error: & error" hier verwendet (objective-c)

7

warum hier "error: & amp; error" verwendet wird (objective-c)

%Vor%

würde ein Objekt in objective-c sowieso nicht effektiv per Referenz übergeben?

    
Greg 30.11.2011, 23:28
quelle

2 Antworten

20

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:

%Vor%

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.

%Vor%

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.

%Vor%     
e.James 30.11.2011, 23:34
quelle
3

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.

    
justin 30.11.2011 23:41
quelle