Was ist der Punkt von (NSError **) Fehler?

8

Beispiel: Die Methode -save: von NSManagedObjectContext wird wie folgt deklariert:

%Vor%

Da NSError bereits eine Klasse ist und die Übergabe eines Zeigers tatsächlich dazu führt, dass dieses Objekt in der Implementierung von -save: geändert wird, welchen Zweck hat es, einen Zeiger auf einen Zeiger zu setzen? Was ist der Vorteil / Sinn?

Anwendungsbeispiel:

%Vor%     
openfrog 14.01.2010, 21:06
quelle

6 Antworten

16

Wenn Sie nur einen Zeiger übergeben haben, würde die gesamte Methode das bereits vorhandene NSError-Objekt, auf das Sie zeigen, ändern.

Wenn Sie einen Zeiger auf einen Zeiger übergeben, kann er neue NSError-Objekte erstellen und Sie mit einem Zeiger beliefern, der auf sie zeigt.

    
Matt Greer 14.01.2010, 21:08
quelle
12

Es wird von einigen Leuten als "out" -Parameter bezeichnet.

Sie übergeben keinen Zeiger an ein NSError-Objekt. Sie übergeben einen Zeiger an eine lokale Variable . Dies gibt der aufgerufenen Methode die Möglichkeit, Ihre lokale Variable zu ändern. In diesem Fall, um es einer NSError-Instanz zuzuordnen.

Vielleicht verwirrend ist, dass die lokale Variable, die Sie an save: übergeben, selbst ein Zeiger ist, sodass der Variablentyp ein Zeiger auf einen Zeiger ist.

Unterste Zeile, es ist ein Zeiger auf eine lokale Variable, und es funktioniert das gleiche, ob die lokale Variable int oder NSError* ist.

    
Darren 14.01.2010 21:32
quelle
6

@Anon ist korrekt. Ich füge hinzu: Dies ist der Cocoa-Weg, um Fehler zu erzeugen, anstatt Ausnahmen zu werfen.

In Ihrem Beispiel haben Sie:

%Vor%

Unmittelbar nach dem Aufruf von save: , wenn ein Fehler aufgetreten ist, hat die save: Methode ein neues NSError Objekt erstellt und Ihre error Variable so geändert, dass sie von nil auf neu zeigt Fehlerobjekt Auf diese Weise können Sie das Objekt NSError selbst untersuchen und entsprechend darauf reagieren.

IMO, das ist sauberer, als eine Ausnahme zu werfen (was in meiner Philosophie nur geschehen sollte, wenn etwas katastrophales und nicht behebbares passiert).

    
Dave DeLong 14.01.2010 21:11
quelle
3

Es ermöglicht der Methode, einen neuen NSError zuzuweisen und den Zeiger so zu ändern, dass er auf diesen verweist, anstatt den NSError, auf den bereits hingewiesen wurde, zu ändern (was ist, wenn er nicht groß genug ist?)

    
Anon. 14.01.2010 21:07
quelle
3

Der Vorteil ist, dass Sie das NSError-Objekt nicht erstellen müssen. Wie die Dokumentation sagt:

" Ein Zeiger auf ein NSError-Objekt. Sie müssen kein NSError-Objekt erstellen. "

    
Peter B 14.01.2010 21:09
quelle
1
  

Wenn Sie gerade einen Zeiger übergeben haben   Die Methode könnte das ändern   bereits vorhandenes NSError-Objekt, das   Sie zeigen auf.

Sie können ein NSError-Objekt nicht ändern.

NSError ist unveränderlich. Aus diesem Grund benötigen Sie den Zeiger auf die Variable NSError. Sie können nur einen brandneuen NSError erstellen. So ändern Sie den Zeiger, um auf Ihren neu erstellten NSError zu zeigen.

    
MacMark 23.11.2010 10:49
quelle

Tags und Links