Jak pozbyć się ostrzeżenia o „nieużywanej zmiennej” w Xcode?

98

Dokładnie rozumiem, dlaczego pojawiają się nieużywane ostrzeżenia o zmiennych. Generalnie nie chcę ich tłumić, ponieważ w większości przypadków są niezwykle przydatne. Rozważ jednak następujący (wymyślony) kod.

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

Xcode zgłasza, że savedjest nieużywaną zmienną, chociaż oczywiście tak nie jest. Podejrzewam, że to dlatego, że NSAssert1jest to makro. NS_BLOCK_ASSERTIONSMakro nie zdefiniowane, więc twierdzenia Objective C są zdecydowanie włączone.

Chociaż niczego to nie boli, uważam to za nieporządne i denerwujące i chcę to stłumić, ale nie jestem pewien, jak to zrobić. Przypisanie zmiennej do samej siebie usuwa ostrzeżenie kompilatora, ale wolałbym zrobić to we „właściwy” sposób, jeśli coś takiego istnieje.

Gregory Higley
źródło

Odpowiedzi:

107

Nie jestem pewien, czy jest on nadal obsługiwany w nowym kompilatorze LLVM, ale GCC ma atrybut „nieużywany”, którego można użyć do pominięcia tego ostrzeżenia:

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

Alternatywnie (w przypadku, gdy LLVM nie obsługuje powyższego), możesz podzielić deklarację zmiennej na oddzielną linię, gwarantując, że zmienna będzie „używana” niezależnie od tego, czy makro się rozwinie, czy nie:

BOOL saved = NO;
saved = [moc save:&error];
Sherm Pendley
źródło
107

Używając Xcode 4.3.2 i odkryłem, że to wydaje się działać (mniej pisania)

BOOL saved __unused;
JOM
źródło
To nie działa dla mnie, dostaję ostrzeżenie, że'saved' was marked as unused but was used
Heath Borders
37

W Xcode możesz ustawić ostrzeżenia dla „Nieużywanych zmiennych”. Przejdź do „Ustawień budowania” dla celu i filtruj ze słowem „nieużywane”

Oto zrzut ekranu: Zrzut ekranu ustawień Builld

Sugeruję, aby zmienić to tylko dla debugowania. W ten sposób niczego nie przegapisz w swojej wydanej wersji.

Czarna żaba
źródło
37
Czy przegapiłeś część pytania, w której Gregory powiedział: „Generalnie nie chcę ich tłumić, ponieważ są one niezwykle przydatne w większości przypadków”?
Sherm Pendley,
8
@ShermPendley Niezależnie od tego, jest to nadal przydatne, odpowiadało na moje pytanie, jak wyłączyć to globalnie.
rafian
9
wyłączenie ostrzeżeń to świetny sposób na pominięcie błędów. Gorąco odradzam.
orion elenzil
2
@orionelenzil - cóż, tak i nie. Istnieje prawdziwy problem z interfejsem z fałszywymi alarmami. Ostrzeżenie pojawia się stale podczas pisania kodu, jeśli nie dotarłeś do części kodu, w której używasz zmiennej. Z czasem nauczy Cię to ignorować ostrzeżenie, co oznacza, że ​​możesz przegapić ważniejsze błędy. Lepiej byłoby mieć możliwość wyeliminowania błędu w aktywnie edytowanych blokach kodu.
TechZen
Cześć, działa dobrze, jeśli ustawię NIE. ale mam wątpliwości: muszę ustawić debugowanie i wydanie NIE ya tylko Nieużywana zmienna: NIE? który muszę ustawić. Jeśli ustawię Totally NO, to nie stworzy żadnego problemu podczas wydania na?
SR Nayak
22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Spróbuj w ten sposób. To działa dla mnie. Dla ciebie też zadziała.

Danny Xu
źródło
To nie działa dla mnie, dostaję ostrzeżenie, że'saved' was marked as unused but was used
Heath Borders
15

Jedynym prostym i przenośnym sposobem oznaczenia zmiennej jako używanej jest… jej użycie.

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

Możesz być zadowolony z już opisanych rozszerzeń specyficznych dla kompilatora.

user3125367
źródło
2
Wolę to od brzydkiej #pragmy opisanej powyżej.
Northernman
1
Hej stary, fajna wskazówka
dimazava
14
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

ŹRÓDŁO

Alex
źródło
Jest to najczystsze podejście, ponieważ wyłącza tylko ostrzeżenie między tymi #pragmami
cornr
8

spróbuj z atrybutem: __unused. Działa w Xcode 5

João Nunes
źródło
5

Można ustawić ostrzeżenie „Nie” kompilatora LLVM 2.0 dla „Wersja”wprowadź opis obrazu tutaj

Ar No
źródło
4

To jest sposób, w jaki robisz to w C, a zatem także w Objective-C.

Nawet jeśli nie masz włączonych ostrzeżeń, zawsze dobrze jest oznaczyć zwracaną wartość jako jawnie zignorowaną. Ma to również na celu pokazanie innym programistom, że nie tylko zapomnieliście o zwracanej wartości - faktycznie zdecydowaliście się ją zignorować.

(void)[moc save:&error];

EDYCJA: Kompilatory ignorują rzutowania do void, więc nie powinno to wpływać na wydajność - to tylko ładna, czysta ludzka adnotacja.

Trenskow
źródło
W niektórych kontekstach MUSISZ użyć tego hacka, aby uzyskać kod Objective-C do kompilacji. Używanie (void)to najwyraźniejszy sposób, dzięki!
Dan Rosenstark
1

Niech zajmie dwie linie. Oddziel deklarację i wartość domyślną

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
0xFADE
źródło