7

Es gibt viele Cocoa-Methoden, die ein NSError-Objekt als Parameter für eine Methode benötigen, aber in Wirklichkeit ein Fehlerobjekt an die aufrufende Methode zurückgeben, wenn Fehler vorhanden sind. Wird dieses zurückgegebene Objekt beibehalten? Das heißt, in dem anrufenden Objektcode (das Verfahren zu dem der Fehler zurückgegeben wird), ist es müssen einige Code wie:Muss ich ein zurückgegebenes NSError-Objekt freigeben?

NSError *error; 
    [apiCall .... error:&error]; 

    if (error){ 
    [*error release]; 
} 

ich diese irgendwo gesehen haben, und wenn es nicht sein müssen freigegeben, ist das der Weg, es zu tun?

Antwort

7

Zurückgegebene Objekte werden normalerweise automatisch freigegeben. Die allgemeine Regel ist, dass Sie nur auto-/release aufrufen, wenn Sie früher copy/alloc/retain auf dem gleichen Objekt aufgerufen haben. Und Sie würden nicht dereferenzieren error in einem Methodenaufruf:

// right 
[error code] 
// wrong 
[*error code] 
+0

Der Grund, warum ich den [* Fehlercode] gesetzt habe, ist, dass Sie auch die NSError-Variable wie folgt angeben können: NSError ** error; Was ist ein Punkt zu einem Punkt auf das Objekt. Ist das gültig? – casademora

+0

Sie geben 'NSError **' als Typ für 'Fehler' nur dann an, wenn es sich um einen 'Ausgangsparameter' oder 'Ausgangsparameter' handelt. In diesem Fall würden Sie deneferenzieren, aber beachten Sie, dass "* error" den Typ 'NSError *' hätte. Sie verwenden out-Parameter, um zu umgehen, dass Funktionen nur einen Rückgabewert haben. Out-Parameter in Objc-C verwenden 'Type **', da Argumente Pass-by-Value sind. Beachten Sie auch, dass, wenn 'error' den Typ' NSError ** 'hätte, Sie ihn entweder mit einem Zeiger auf ein' NSError * 'initialisieren müssten (was Sie im API-Aufruf tun) oder einen Zeiger zuweisen, was passiert aber ist ein bisschen seltsam. – outis

+0

@outis Wenn es automatisch freigegeben wird, dann wird es nicht in der Aufrufermethode falsch verwendet. Weil der Umfang der Methode, die tatsächlich den NSError * erzeugt und ihn dem out-Parameter NSError ** zugewiesen hat, mit dem Methodenaufruf beendet ist und wir ihn danach im Aufrufer verwenden. – SayeedHussain

4

Sie keinen Speicher für den Fehler zugeordnet haben, so brauchen Sie nicht, es zu veröffentlichen. In der Regel fügt das Framework den von ihm erstellten Objekten normalerweise eine automatische Freigabe hinzu.

6

Lesen Sie die Speicherregeln auf developer.apple.com Trauen Sie nie wieder jemand wie 'Sie zuvor genannt kopieren/allok/behalten' - dies ist nicht die Regel, die tatsächlich etwas sagt wie 'Sie erhielten das Objekt über eine Methode mit Kopie, Neu oder Alloc als Teil des Namens '. Vertrauen Sie mir nicht wieder, lesen Sie developer.apple.com

NSError * *, das ist einfach falsch. Die METHOD verwendet einen NSError * * als ihr Argument, das ist ein Zeiger auf einen NSError *. Es ist der POINTER TO NSError *, der mit der Adresse eines NSError gefüllt wird, der von irgendwo kommt, und Sie haben kein Recht anzunehmen, wo.

Sie können nur einen Zeiger auf einen NSError * übergeben - alles andere ist falsch.

Noch sollten Sie davon ausgehen, dass der NSError automatisch freigegeben wird. Es kann ein Singleton sein, es könnte eine beliebige Anzahl von Alternativen sein. Alles, was Sie wissen müssen, ist, dass Sie es nicht behalten haben, Sie müssen es nicht freigeben.

+0

Die Eigentumsrichtlinie (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html # // apple_ref/doc/uid/20000043-SW1) ist, dass Methoden mit copy/alloc/new den Besitz implizieren (und explizit den Besitz erklären), was bestimmt, wer Freigabemeldungen sendet. – outis

+0

dritte Parteien sind nicht verpflichtet, diese Politik zu folgen, aber Apples Empfehlung ist ein erstelltes NSError zu Autorelease, bevor er zurückkehrt (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError .html # // apple_ref/doc/uid/TP40001806-CH204-SW5) – outis

+0

Daher "allgemein autoreleased" und "allgemeine Regel". – outis