Wie kann ich eine Warnung "Nicht verwendete Variable" in Xcode entfernen?


98

Ich verstehe genau, warum nicht verwendete Variablenwarnungen auftreten. Ich möchte sie im Allgemeinen nicht unterdrücken, weil sie in den meisten Fällen unglaublich nützlich sind. Beachten Sie jedoch den folgenden (erfundenen) Code.

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode meldet, dass dies savedeine nicht verwendete Variable ist, obwohl dies natürlich nicht der Fall ist. Ich vermute, das liegt daran, dass NSAssert1es sich um ein Makro handelt. Das NS_BLOCK_ASSERTIONSMakro ist nicht definiert, daher sind Objective C-Zusicherungen definitiv aktiviert.

Es tut zwar nichts weh, aber ich finde es unordentlich und nervig, und ich möchte es unterdrücken, bin mir aber nicht sicher, wie ich das machen soll. Wenn Sie die Variable sich selbst zuweisen, wird die Compiler-Warnung entfernt, aber ich würde es lieber "richtig" machen, wenn so etwas existiert.

Antworten:


107

Ich bin nicht sicher, ob es im neuen LLVM-Compiler noch unterstützt wird, aber GCC verfügt über ein "nicht verwendetes" Attribut, mit dem Sie diese Warnung unterdrücken können:

BOOL saved __attribute__((unused)) = [moc save:&error];

Alternativ (falls LLVM das oben Gesagte nicht unterstützt) können Sie die Variablendeklaration in eine separate Zeile aufteilen, um sicherzustellen, dass die Variable "verwendet" wird, unabhängig davon, ob das Makro erweitert wird oder nicht:

BOOL saved = NO;
saved = [moc save:&error];

107

Mit Xcode 4.3.2 und fand heraus, dass dies zu funktionieren scheint (weniger Schreiben)

BOOL saved __unused;

Das funktioniert bei mir nicht, ich bekomme eine Warnung, dass'saved' was marked as unused but was used
Heath Borders

37

In Xcode können Sie die Warnungen für "Nicht verwendete Variablen" festlegen. Gehen Sie zu "Build Settings" für das Ziel und filtern Sie mit dem Wort "unbenutzt".

Hier ist ein Screenshot: Screenshot der Builld-Einstellungen

Ich schlage vor, Sie ändern es nur für Debug. Auf diese Weise verpassen Sie nichts in Ihrer Release-Version.


37
Haben Sie den Teil der Frage verpasst, in dem Gregory sagte: "Ich möchte sie im Allgemeinen nicht unterdrücken, weil sie in den meisten Fällen unglaublich nützlich sind."
Sherm Pendley

8
@ShermPendley Unabhängig davon ist dies immer noch nützlich. Es hat meine Frage beantwortet, wie es global deaktiviert werden kann.
Raffian

9
Das Deaktivieren von Warnungen ist eine gute Möglichkeit, Fehler zu übersehen. Ich kann es nur empfehlen.
Orion Elenzil

2
@orionelenzil - na ja und nein. Es gibt ein echtes Schnittstellenproblem mit falsch positiven Ergebnissen. Die Warnung wird ständig angezeigt, während Sie Code schreiben, wenn Sie nicht zu dem Teil des Codes gelangt sind, in dem Sie die Variable verwenden. Mit der Zeit lernen Sie, die Warnung zu ignorieren, was bedeutet, dass Sie möglicherweise wichtigere Fehler übersehen. Es wäre besser, den Fehler in Codeblöcken zu unterdrücken, die aktiv bearbeitet werden.
TechZen

Hallo, es funktioniert gut, wenn ich NEIN setze. aber mein Zweifel ist: Ich muss Debug & Release einstellen. NEIN ya nur Unbenutzte Variable: NEIN? welches muss ich einstellen. Wenn ich Totally NO setze, dann wird während der Veröffentlichung kein Prob erstellt. Na?
SR Nayak

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Versuchen Sie es so. Es funktioniert für mich. Es wird auch für Sie funktionieren.


Das funktioniert bei mir nicht, ich bekomme eine Warnung, dass'saved' was marked as unused but was used
Heath Borders

15

Die einzige einfache und tragbare Möglichkeit, Variablen als verwendet zu markieren, besteht darin, sie zu verwenden.

BOOL saved = ...;
(void)saved; // now used

Möglicherweise sind Sie jedoch mit bereits beschriebenen compilerspezifischen Erweiterungen zufrieden.


2
Ich bevorzuge dies gegenüber dem oben beschriebenen hässlichen #Pragma.
Nordmann

1
Hey Bruder, netter Tipp
dimazava

13
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

QUELLE


Dies ist der sauberste Ansatz, da nur die Warnung zwischen diesen #pragmas
cornr


5

Sie können die Warnung "No" LLVM Compliler 2.0 auf "Release" setzen.Geben Sie hier die Bildbeschreibung ein


4

So machen Sie es in C und damit auch in Objective-C.

Auch wenn Sie keine Warnungen aktiviert haben, ist es immer eine gute Idee, den Rückgabewert als explizit ignoriert zu markieren. Es zeigt auch anderen Entwicklern, dass Sie den Rückgabewert nicht nur vergessen haben - Sie haben sich tatsächlich ausdrücklich dafür entschieden, ihn zu ignorieren.

(void)[moc save:&error];

BEARBEITEN: Compiler ignorieren Casts zu void, daher sollte dies die Leistung nicht beeinträchtigen - es ist nur eine schöne, saubere menschliche Anmerkung.


In bestimmten Kontexten MÜSSEN Sie diesen Hack verwenden, um den Objective-C-Code zum Kompilieren zu erhalten. Verwenden (void)ist der klarste Weg, danke!
Dan Rosenstark

1

Lassen Sie es zwei Zeilen aufnehmen. Trennen Sie die Deklaration und den Standardwert

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.