Xcode 4-Warnung "Ausdrucksergebnis nicht verwendet" für NSURLConnection

72

Ich versuche nur, meine übliche Datenübertragung durchzuführen. Ich definiere meine NSMutableURLRequest und rufe dann auf

[[NSURLConnection alloc] initWithRequest:request delegate:self];

Früher war dies mit Xcode 3 in Ordnung, aber Xcode 4 warnt mich vor " Ausdrucksergebnis nicht verwendet " in dieser Zeile. Die Anfrage funktioniert, aber ich möchte einen Weg finden, um die Warnung loszuwerden.

Ich nehme an, ich könnte die Verbindung in einer Variablen speichern, aber ich brauche sie nicht wirklich und ich kann nicht sehen, wo ich sie in nildie nächste Zeile setzen soll (obwohl dies die Warnung entfernen würde)

Bitte beachten Sie: Ich bin nicht 100% sicher, ob es sich um Xcode 4 handelt oder ob ARC aktiviert ist.

Johann
quelle

Antworten:

182

Wenn eine Funktion ein Ergebnis zurückgibt, das Sie nicht benötigen, können Sie es in void umwandeln, um die Compiler-Warnung zu entfernen:

(void) [[NSURLConnection alloc] initWithRequest:request delegate:self];

Ich habe ARC noch nicht verwendet, daher kann ich nicht sagen, ob dies eine gute Idee ist. Vor ARC müssten Sie dieses Zeigerergebnis irgendwo aufbewahren, damit Sie es veröffentlichen können.

Progrmr
quelle
2
Dies hat die Warnung entfernt und die Funktion funktioniert immer noch wie erforderlich, also alles gut! Es ist das erste Mal, dass ich sehe, dass diese Besetzung nichtig ist. Ist es eine gute Praxis? Vielen Dank!
Johann
9
Ja, weil es die Tatsache dokumentiert, dass Sie wissen, dass ein Ergebnis zurückgegeben wird, aber Sie dieses Ergebnis nicht benötigen.
Programm
Dies ist, was ich gesucht habe
Eyad Fallatah
1
danke guter Mann .. die Welt braucht mehr Superhelden wie Sie :)
Ankit Srivastava
Ich erhalte immer noch die Warnung, wenn ich versuche, ein #define-basiertes Protokollierungsmakro zu verwenden: #if SHOW_DEBUG_LOG # define DEBUG_LOG(x,...) NSLog(@"Debug Log: "x, __VA_ARGS__) #else # define DEBUG_LOG(x,...) (void)(x); do { (void)(__VA_ARGS__); } while (0) #endif
Dan F
34

Die Antwort vonprogrmr ist richtig, aber hier ist eine noch sauberere Methode:

[NSURLConnection connectionWithRequest:request delegate:self];

Dies verursacht keine Warnung, auch wenn Sie das Ergebnis nicht für ungültig erklären.

Elliot
quelle
Veraltet ab iOS 10. :(
Seva Alekseyev
3

Jemand sollte dafür verantwortlich sein NSURLConnection. Es wird nicht benötigt, um die Verbindung zu speichern, aber es ist besser, wenn Sie dies tun. Das Problem ist, dass nach Ihrer Erstellung NSURLConnectionniemand einen Zeiger auf die erstellte Instanz hat, was nicht der Fall sein sollte.

Nehmen wir folgendes Beispiel an:

  1. Ihre Instanz von ClassAerstellt ein Instane vonNSURLConnection
  2. Ihre Instanz von ClassAwird freigegeben und freigegeben
  3. NSURLConnection ist noch am Leben und wird den Delegaten an Ihre freigegebene Instanz entlassen.

Um dieses Problem zu lösen, sollten Sie die Instanz von speichern NSURLConnectionund diese Verbindung freigeben, wenn Ihre Instanz ClassAfreigegeben wird, was dazu führt, dass auch die Instanz von freigegeben wird NSURLConnection.

Thomas
quelle
Ich kann es nicht veröffentlichen, da ARC eingeschaltet ist. Ist es nicht das, was ARC automatisch tun soll, um die Zuordnung des Zeigers aufzuheben?
Johann
1
Aber das Problem besteht immer noch semantisch: NSURLConnectionkennt Ihre Instanz von, ClassAaber niemand kennt Ihre Instanz. Es gibt eine Beziehung zwischen beiden Instanzen und diese Beziehung muss verwaltet werden;) Wenn Sie den Zeiger jedoch nicht speichern, NSURLConnectionhat niemand einen Zeiger darauf und ARC gibt die Verbindung sofort oder nie frei. Wenn Sie den resultierenden Zeiger speichern, wird die Warnung nicht angezeigt und Sie haben ein besseres Codierungsdesign und können dann zuverlässigeren Code schreiben:connection:(NSURLConnection*)con didSth{if(con != self.curCon) return;}
Thomas