Bagaimana saya bisa menghilangkan peringatan "variabel yang tidak digunakan" di Xcode?

98

Saya mengerti persis mengapa peringatan variabel yang tidak terpakai terjadi. Saya tidak ingin menekannya secara umum, karena mereka sangat berguna dalam banyak kasus. Namun, pertimbangkan kode berikut (dibuat-buat).

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

Laporan Xcode yang savedmerupakan variabel yang tidak digunakan, padahal tentu saja tidak. Saya menduga ini karena NSAssert1makro. The NS_BLOCK_ASSERTIONSmakro tidak didefinisikan, sehingga C pernyataan Objective pasti diaktifkan.

Meskipun tidak menyakiti apa pun, saya merasa tidak rapi dan menjengkelkan, dan saya ingin menekannya, tetapi saya tidak yakin bagaimana melakukannya. Menempatkan variabel untuk dirinya sendiri menghilangkan peringatan compiler, tapi saya lebih suka melakukannya dengan cara yang "benar" jika hal seperti itu ada.

Gregory Higley
sumber

Jawaban:

107

Saya tidak yakin apakah ini masih didukung di compiler LLVM baru, tetapi GCC memiliki atribut "tidak terpakai" yang dapat Anda gunakan untuk menyembunyikan peringatan itu:

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

Atau (jika LLVM tidak mendukung hal di atas), Anda dapat membagi deklarasi variabel menjadi baris terpisah, menjamin bahwa variabel akan "digunakan" apakah makro diperluas atau tidak:

BOOL saved = NO;
saved = [moc save:&error];
Sherm Pendley
sumber
107

Menggunakan Xcode 4.3.2 dan menemukan bahwa ini sepertinya berfungsi (lebih sedikit tulisan)

BOOL saved __unused;
JOM
sumber
Ini tidak berhasil untuk saya, saya mendapat peringatan bahwa'saved' was marked as unused but was used
Heath Borders
37

Di Xcode Anda dapat mengatur peringatan untuk "Variabel yang Tidak Digunakan." Buka "Build Settings" untuk target dan filter dengan kata "unused"

Ini tangkapan layarnya: Screenshot Pengaturan Builld

Saya sarankan Anda hanya mengubahnya untuk Debug. Dengan begitu, Anda tidak akan melewatkan apa pun dalam versi rilis Anda.

Katak Hitam
sumber
37
Apakah Anda melewatkan bagian dari pertanyaan di mana Gregory berkata "Saya tidak ingin menyembunyikannya secara umum, karena mereka sangat berguna dalam banyak kasus"?
Sherm Pendley
8
@ShermPendley Terlepas dari itu, ini masih berguna, ini menjawab pertanyaan saya tentang cara mematikannya secara global.
raffian
9
mematikan peringatan adalah cara terbaik untuk menghilangkan bug. Saya sangat merekomendasikan melawan.
orion elenzil
2
@ orionelenzil - ya, ya dan tidak. Ada masalah antarmuka nyata dengan positif palsu. Peringatan muncul terus-menerus saat Anda menulis kode jika Anda belum sampai ke bagian kode tempat Anda menggunakan variabel. Seiring waktu, ini akan melatih Anda untuk mengabaikan peringatan yang berarti Anda mungkin melewatkan kesalahan yang lebih penting. Akan lebih baik jika bisa menekan kesalahan dalam blok kode yang sedang diedit secara aktif.
TechZen
Hai, ini berfungsi dengan baik jika saya menyetel TIDAK. tapi keraguan saya adalah: saya harus mengatur Debug & Rilis NO ya hanya Variabel yang Tidak Terpakai: TIDAK? mana yang harus saya atur. Jika saya mengatur Benar-benar TIDAK, maka tidak menimbulkan masalah selama rilis na?
SR Nayak
22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Coba seperti ini. Ini berhasil untuk saya. Ini akan berhasil juga untuk Anda.

Danny Xu
sumber
Ini tidak berhasil untuk saya, saya mendapat peringatan bahwa'saved' was marked as unused but was used
Heath Borders
15

Satu-satunya cara sederhana dan portabel untuk menandai variabel sebagai digunakan adalah… dengan menggunakannya.

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

Anda mungkin senang dengan ekstensi khusus kompiler yang telah dijelaskan.

pengguna3125367
sumber
2
Saya lebih suka ini daripada #pragma jelek yang dijelaskan di atas.
utara
1
Hei bro, tip bagus
dimazava
14
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

SUMBER

Alex
sumber
Ini adalah pendekatan terbersih karena hanya menonaktifkan peringatan antara #pragmas tersebut
cornr
8

coba dengan: atribut __unused. Bekerja di Xcode 5

João Nunes
sumber
5

Anda dapat menyetel peringatan "Tidak" LLVM compiler 2.0 pada "Rilis"masukkan deskripsi gambar di sini

Ar Tidak
sumber
4

Ini adalah cara Anda melakukannya di C dan juga Objective-C.

Meskipun Anda tidak mengaktifkan peringatan, sebaiknya tandai nilai kembalian sebagai diabaikan secara eksplisit. Ini juga menunjukkan kepada pengembang lain, bahwa Anda tidak hanya melupakan nilai pengembalian - Anda memang secara eksplisit memilih untuk mengabaikannya.

(void)[moc save:&error];

EDIT: Penyusun mengabaikan cast ke void, jadi seharusnya tidak memengaruhi performa - itu hanya anotasi manusia yang bersih dan bagus.

Trenskow
sumber
Dalam konteks tertentu Anda HARUS menggunakan peretasan ini untuk mendapatkan kode Objective-C untuk dikompilasi. Menggunakan (void)adalah cara paling jelas untuk pergi, terima kasih!
Dan Rosenstark
1

Buat itu mengambil dua baris. Pisahkan deklarasi dan nilai default

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
0xFADE
sumber