Saya ingin menggunakan pemilih pada instance NSObject tanpa perlu protokol yang diimplementasikan. Misalnya, ada metode kategori yang harus menetapkan properti kesalahan jika instance NSObject yang dipanggil mendukungnya. Ini kodenya, dan kodenya berfungsi sebagaimana dimaksud:
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
Namun, kompiler tidak melihat metode apa pun dengan setError: signature, sehingga memberi saya peringatan, untuk setiap baris yang berisi @selector(setError:)
potongan:
Undeclared selector 'setError:'
Saya tidak ingin harus mendeklarasikan protokol untuk menghilangkan peringatan ini, karena saya tidak ingin semua kelas yang menggunakan ini untuk mengimplementasikan sesuatu yang istimewa. Hanya dengan konvensi, saya ingin mereka memiliki setError:
metode atau properti.
Apakah ini bisa dilakukan? Bagaimana?
Cheers,
EP
sumber
Jawaban:
Opsi lain adalah menonaktifkan peringatan dengan:
Anda dapat menempatkan baris ini di file .m di mana peringatan itu terjadi.
Memperbarui:
Ia bekerja juga dengan LLVM seperti ini:
sumber
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
// Do your thing
#pragma clang diagnostic pop
#pragma clang diagnostic ignored "-Wselector"
Lihatlah NSSelectorFromString .
Ini akan memungkinkan Anda untuk membuat pemilih pada saat runtime, bukan pada waktu kompilasi melalui
@selector
kata kunci, dan kompiler tidak akan memiliki kesempatan untuk mengeluh.sumber
sel_registerName()
terlihat tidak jelas dan jenis yang Anda tidak boleh menelepon langsung kecuali Anda tahu apa yang Anda lakukan, agak seperti obj_msg_send ();)Saya pikir ini karena beberapa alasan aneh pemilih tidak terdaftar dengan runtime.
Coba daftarkan pemilih melalui
sel_registerName()
:sumber
NSSelectorFromString
memanggil disel_registerName()
bawah tenda. Pilih mana yang lebih cocok untuk Anda.sel_registerName()
langsung lebih eksplisit tentang mengapa Anda melakukannya.NSSelectorFromString
tidak memberi tahu Anda bahwa itu akan mencoba mendaftarkan pemilih.Saya mendapat pesan itu untuk pergi dengan # memasukkan file dengan metode. Tidak ada lagi yang digunakan dari file itu.
sumber
Saya sadar saya agak terlambat untuk utas ini tetapi untuk kelengkapan, Anda dapat mematikan peringatan ini secara global menggunakan pengaturan target build.
Pada bagian, 'peringatan Apple LLVM - Objective-C', ubah:
sumber
Jika kelas Anda mengimplementasikan metode setError: (bahkan dengan mendeklarasikan dinamis setter dari properti error akhirnya) Anda mungkin ingin mendeklarasikannya dalam file antarmuka Anda (.h), atau jika Anda tidak ingin menunjukkannya dengan cara yang Anda bisa coba dengan trik rumit PrivateMethods:
tepat sebelum @ implementasi Anda, ini seharusnya menyembunyikan peringatan;).
sumber
PerformSelector may cause a leak because its selector is unknown
Sebuah makro benar-benar nyaman untuk dimasukkan ke dalam Anda
.pch
atauCommon.h
atau di mana pun Anda inginkan:Ini pengeditan dari pertanyaan ini untuk masalah serupa ...
sumber
Anda dapat mematikannya di Xcode seperti di tangkapan layar:
sumber
Anda juga dapat melemparkan objek tersebut ke id terlebih dahulu untuk menghindari peringatan:
sumber
Cara lain untuk menghindari peringatan ini adalah memastikan metode pemilih Anda terlihat seperti ini:
Jangan lupa "pengirim" (id) "jika Anda ingin menerima pengirim apa pun atau tentukan jenis objek pengirim jika Anda mau.
sumber
Sementara jawaban yang benar kemungkinan terletak pada menginformasikan Xcode melalui impor atau mendaftarkan pemilih bahwa pemilih seperti itu ada, dalam kasus saya, saya kehilangan tanda titik koma. Pastikan sebelum Anda "memperbaiki" kesalahan yang mungkin, kesalahan itu benar dan kode Anda tidak. Saya menemukan kesalahan dalam sampel MVCNetworking Apple, misalnya.
sumber
Saya bisa mendapatkan peringatan untuk pergi dengan menambahkan metode yang menenangkan (pengungkapan: Saya tidak memikirkan hal ini tetapi menemukannya dengan googling pada jadwal yang lebih lama dengan waktu tambahan)
Sementara saya menghargai mengetahui cara menyembunyikan peringatan, memperbaikinya lebih baik dan teknik Sergio maupun Relkin tidak bekerja untuk saya, karena alasan yang tidak diketahui.
sumber