2014-02-27 13 views
10

In meiner App, die AFNetworking/NSURLConnection zum Senden von Anforderungen an den Server verwendet, sehe ich manchmal (sehr selten) diesen Fehler bei einem Vorgangsfehler Block:AFNetworking/NSURLConnection empfängt NSPOSIXErrorDomain Code = 9 "Der Vorgang konnte nicht abgeschlossen werden. Fehlerhafter Dateideskriptor"

Error Domain=NSPOSIXErrorDomain Code=9 "The operation couldn’t be completed. Bad file descriptor" 

bei https://devforums.apple.com/message/278770#278770 eine Antwort auf eine ähnliche Frage gibt es:

It means that someone has been deallocating file descriptors out from underneath NSURLConnection.

Aber in meinem eigenen Code ich habe keine Ströme von Datei-Deskriptoren in irgendeiner Weise berühren. Es sind nur einfache GET/POST-Anfragen.

Was könnte die Ursache für dieses Problem sein?

Hat jemand diesen Fehler bei seinen AFNetworking-Vorgängen festgestellt?

Wie kann ich diesen Dateideskriptor absichtlich schließen, wenn ich wirklich wollte? Die Antwort auf diese Frage wird mir helfen, das Problem besser zu verstehen.

+0

Hallo, ich habe gerade angefangen, den gleichen Fehler mit einem meiner Kunden zu bekommen. Sind Sie dem Problem auf den Grund gegangen? –

+0

Nein, leider. Ich behandle sie wie jeden anderen Netzwerkfehler. – kolyuchiy

Antwort

1

Nach this Apple TechNote auf Multitasking und Netzwerk können Sie EBADF (POSIX Fehler 9) erhalten, wenn die App ausgesetzt ist und der Socket zurückgefordert wird.

Note: When your app resumes execution the actual error returned by a socket's whose resources have been reclaimed is purposely not specified here to allow for future refinements. However, in many cases the error will be EBADF , which is probably not what you were expecting! Under normal circumstances EBADF means that the app has passed an invalid file descriptor to a system call. However, in the case of a socket whose resources have been reclaimed, it does not mean that the file descriptor was invalid, just that the socket is no longer usable.

2

(ich glaube nicht, das eine vollständige Antwort, aber ich hoffe, es wird hilfreich sein und kann in ein gedreht werden.)

Der Fehler man es EBADF suchen. Es wird vom Betrieb mit einer geschlossenen Datei zurückgegeben. Aber du hast das schon herausgefunden. :)

Angenommen, Sie verwenden nicht die stdio-Bibliothek, ich denke, was Sie gerade laufen, ist das Äquivalent einer Overrelease. Im Grunde geben Sie den Besitz einer Datei an etwas weiter, das dann geschlossen wird.

Sie sollten besonderes Augenmerk auf NSFileHandle zahlen, vor allem zu sehen, ob Sie oder jemand initWithFileDescriptor:, copy ruft eine Datei ing usw. Diese die NSFileHandle Eigentum an der Dateideskriptor nehmen die dazu führen könnten, was bedeutet, es zu schließen, wenn es freigegeben.

Schauen Sie sich weniger Ihren Netzwerkcode an und mehr darüber, wie Sie die Dateien einrichten.

+0

Danke für die Antwort! Nach meinem Code kommt dieser Fehler direkt von NSURLConnectionDelegate Verbindung: DidFailWithError: Callback. Wie kann eine der Dateien, die ich in meiner App öffne, diesen Fehler verursachen? – kolyuchiy

+0

Dateien verhalten sich eher wie rohe Zeiger als Objective-C-Objekte, wenn dies für Sie sinnvoll ist. Ein Objekt kann viele Male besitzen, und jedes dieser Besitzkennzeichen muss verschwinden, bevor das Objekt selbst aus dem Speicher freigegeben wird. Im Gegensatz dazu müssen Sie ein Dateihandle nur einmal schließen, damit es geschlossen wird. Deshalb frage ich mich, ob mehr als ein Objekt den gleichen Dateigriff hat und einer dieser Dateigriffe geschlossen wird. –

Verwandte Themen