Nachdem ich Xcode auf Version 5.1 aktualisiert hatte, gab es eine Warnung, die mir sagte, dass ich eine Konstante definiert hatte, die ich nicht verwendete. Seine Definition sah so aus:
%Vor%Ich war froh zu sehen, dass es markiert wurde, weil ich dachte, dass dies bedeutete, dass der Compiler nun in der Lage war, zusätzlich zu den Variablen nach unbenutzten Konstanten zu suchen.
Ich habe etwas mehr umstrukturiert, wodurch drei NSString
-Konstanten obsolet geworden sind. Alle drei wurden sehr ähnlich wie die NSInteger
von oben definiert:
Zu meiner Überraschung werden diese jedoch nicht als "unbenutzt" markiert, obwohl ich sicher bin, dass sie nicht mehr benutzt werden.
Kann jemand erklären, warum ein NSInteger
vom Compiler als unbenutzt wahrgenommen wird, aber ein NSString
nicht?
Eine primitive Variable ist nur ein Speicherblock, der in einem statischen Speicherbereich zugewiesen und vom Compiler initialisiert wird. Das String-Objekt ist jedoch eine Variable, die zur Laufzeit (wahrscheinlich beim Start) initialisiert wird. Der Compiler fügt also dem Konstruktor einen impliziten Aufruf hinzu, und verwendet die Variable als Parameter für diesen Aufruf. Also wird die Variable verwendet.
Das _unused
-Element der Struktur ist IMHO keine Direktive, sondern nur eine Membervariable, wahrscheinlich wird es zur besseren Ausrichtung hinzugefügt (füllt die Objektgröße auf eine runde Größe).
Die Definition eines NSString
Literals zum Zeitpunkt der Kompilierung basiert auf der Verwendung der Meta-Klasse NSSimpleCString
.
Diese Klasse sieht ungefähr so aus:
Das Hinzufügen des _unused
-Flags lässt mich glauben, dass der Code den Compiler dazu anweist, diese Warnungen mit NSSimpleCString
zum Schweigen zu bringen
Sie können es versuchen, indem Sie Ihre Ganzzahl oder Gleitkommazahl mit __unused
like:
Für eine ausführlichere Erklärung lesen Sie den Artikel über Literale von Mike Ash
Tags und Links objective-c clang unused-variables