Xcode'da "kullanılmayan değişken" uyarısından nasıl kurtulabilirim?


98

Kullanılmayan değişken uyarılarının neden oluştuğunu tam olarak anlıyorum. Genel olarak onları bastırmak istemiyorum çünkü çoğu durumda inanılmaz derecede faydalıdırlar. Ancak, aşağıdaki (yapmacık) kodu göz önünde bulundurun.

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

Xcode saved, elbette kullanılmadığı halde kullanılmayan bir değişken olduğunu bildirir . Bunun NSAssert1bir makro olduğundan şüpheleniyorum . NS_BLOCK_ASSERTIONSMakro edilir değil Objective C iddialar kesinlikle etkindir, yani tanımlanmış.

Hiçbir şeyi incitmese de, onu düzensiz ve sinir bozucu buluyorum ve bastırmak istiyorum ama nasıl yapacağımdan emin değilim. Değişkeni kendisine atamak derleyici uyarısını ortadan kaldırır, ancak böyle bir şey varsa bunu "doğru" şekilde yapmayı tercih ederim.

Yanıtlar:


107

Yeni LLVM derleyicisinde hala desteklenip desteklenmediğinden emin değilim, ancak GCC bu uyarıyı bastırmak için kullanabileceğiniz "kullanılmayan" bir özniteliğe sahiptir:

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

Alternatif olarak (LLVM yukarıdakileri desteklemiyorsa), değişken bildirimini ayrı bir satıra bölerek, makro genişlese de genişlese de değişkenin "kullanılacağını" garanti edebilirsiniz:

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

107

Xcode 4.3.2'yi kullanarak ve bunun işe yaradığını öğrendi (daha az yazma)

BOOL saved __unused;

Bu benim için çalışmıyor, bir uyarı alıyorum'saved' was marked as unused but was used
Heath Borders

37

Xcode'da "Kullanılmayan Değişkenler" için uyarıları ayarlayabilirsiniz. Hedef için "Yapı Ayarları" na gidin ve "kullanılmayan" kelimesiyle filtreleyin

İşte bir ekran görüntüsü: Builld Ayarları Ekran Görüntüsü

Yalnızca Debug için değiştirmenizi öneririm. Bu şekilde yayın sürümünüzde hiçbir şeyi kaçırmazsınız.


37
Gregory'nin "Genel olarak onları bastırmak istemiyorum, çünkü çoğu durumda inanılmaz derecede faydalıdır" dediği soruyu kaçırdınız mı?
Sherm Pendley

8
@ShermPendley Her şeye rağmen, bu hala yararlı, küresel olarak nasıl kapatılacağı konusundaki sorumu yanıtladı.
raffian

9
uyarıları kapatmak, hataları gözden kaçırmanın harika bir yoludur. Karşı tavsiye ederim.
orion elenzil

2
@orionelenzil - evet ve hayır. Yanlış pozitiflerle gerçek bir arayüz sorunu var. Kodun değişkeni kullandığınız kısmına gelmediyseniz, kod yazarken uyarı sürekli olarak açılır. Zamanla, bu sizi uyarıyı görmezden gelme konusunda eğitir, yani daha önemli hataları gözden kaçırabilirsiniz. Aktif olarak düzenlenen kod bloklarındaki hatayı bastırabilmek daha iyi olacaktır.
TechZen

Merhaba, HAYIR'ı ayarlarsam iyi çalışıyor. ama şüphem şu: Hata Ayıklama ve Bırakma HAYIR'ı ayarlamam gerekiyor ya sadece Kullanılmayan Değişken: HAYIR? hangisini ayarlamam gerekiyor. Tamamen HAYIR olarak ayarlarsam, bu durumda na yayınlanırken herhangi bir prob oluşturulmaz mı?
SR Nayak

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

Böyle dene. Benim için çalışıyor. Senin için de işe yarayacak.


Bu benim için çalışmıyor, bir uyarı alıyorum'saved' was marked as unused but was used
Heath Borders

15

Değişkeni kullanıldığı gibi işaretlemenin tek basit ve taşınabilir yolu kullanmaktır.

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

Yine de, önceden açıklanan derleyiciye özgü uzantılardan memnun olabilirsiniz.


2
Bunu yukarıda açıklanan çirkin pragmaya tercih ederim.
Northernman

1
Hey kardeşim, güzel ipucu
dimazava

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

KAYNAK


Bu en temiz yaklaşımdır çünkü yalnızca #pragmas
cornr


5

LLVM compliler 2.0 uyarısını "Sürüm" olarak "Hayır" olarak ayarlayabilirsiniz.görüntü açıklamasını buraya girin


4

Bunu C ve dolayısıyla Amaç-C'de yapmanın yolu budur.

Uyarıları etkinleştirmemiş olsanız bile, dönüş değerini açıkça yok sayıldı olarak işaretlemek her zaman iyi bir fikirdir. Ayrıca, diğer geliştiricilere sadece dönüş değerini unutmadığınızı - gerçekten de açıkça görmezden gelmeyi seçtiğinizi göstermeye gider.

(void)[moc save:&error];

DÜZENLEME: Derleyiciler dökümleri görmezden gelir void, bu yüzden performansı etkilememelidir - bu sadece güzel ve temiz bir insan notudur.


Belirli bağlamlarda, derlemek için Objective-C kodunu elde etmek için bu hack'i kullanmanız GEREKİR. Kullanmanın (void)en net yolu, teşekkürler!
Dan Rosenstark

1

İki satır almasını sağlayın. Bildirimi ve varsayılan değeri ayırın

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.