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.

Gregory Higley
quelle

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];
Sherm Pendley
quelle
107

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

BOOL saved __unused;
JOM
quelle
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.

Schwarzer Frosch
quelle
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.

Danny Xu
quelle
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.

user3125367
quelle
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

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

versuchen Sie es mit: __unused attribute. Funktioniert in Xcode 5

João Nunes
quelle
5

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

Ar Nr
quelle
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.

Trenskow
quelle
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;
0xFADE
quelle