Saya bertanya-tanya bagaimana cara menekan peringatan:
Kategori menerapkan metode yang juga akan diterapkan oleh kelas utamanya.
Saya memiliki ini untuk kategori kode tertentu:
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
return [self aCustomFontOfSize:fontSize];
}
objective-c
clang
Doz
sumber
sumber
super
sebaliknya.Jawaban:
Kategori memungkinkan Anda menambahkan metode baru ke kelas yang ada. Jika Anda ingin menerapkan kembali metode yang sudah ada di kelas, Anda biasanya membuat subkelas, bukan kategori.
Dokumentasi Apple: Menyesuaikan kelas yang ada
Dua metode dengan tanda tangan yang sama persis di kelas yang sama akan menyebabkan perilaku yang tidak dapat diprediksi, karena setiap pemanggil tidak dapat menentukan implementasi yang diinginkan.
Jadi, Anda harus menggunakan kategori dan memberikan nama metode yang baru dan unik untuk kelas tersebut, atau subkelas jika Anda ingin mengubah perilaku metode yang ada di kelas.
sumber
Meskipun semua yang dikatakan dengan indah benar, itu tidak benar-benar menjawab pertanyaan Anda tentang bagaimana cara menekan peringatan itu.
Jika Anda harus memiliki kode ini karena suatu alasan (dalam kasus saya, saya memiliki HockeyKit di proyek saya dan mereka mengganti metode dalam kategori UIImage [edit: ini bukan lagi kasusnya]) dan Anda perlu membuat proyek Anda untuk dikompilasi , Anda dapat menggunakan
#pragma
pernyataan untuk memblokir peringatan seperti ini:Saya menemukan informasinya di sini: http://www.cocoabuilder.com/archive/xcode/313767-disable-warning-for-override-in-category.html
sumber
Alternatif yang lebih baik (lihat jawaban Bneely mengapa peringatan ini menyelamatkan Anda dari bencana) adalah dengan menggunakan metode swizzling. Dengan menggunakan metode swizzling, Anda dapat mengganti metode yang ada dari kategori tanpa ketidakpastian siapa yang "menang", dan sambil mempertahankan kemampuan untuk memanggil metode lama. Rahasianya adalah dengan memberi penggantian nama metode yang berbeda, lalu menukarnya menggunakan fungsi runtime.
Kemudian tentukan implementasi kustom Anda:
Timpa penerapan default dengan Anda:
sumber
Coba ini di kode Anda:
UPDATE2: Tambahkan makro ini
sumber
Anda dapat menggunakan metode swizzling untuk menyembunyikan peringatan compiler ini. Berikut adalah bagaimana saya mengimplementasikan metode swizzling untuk menggambar margin di UITextField ketika kita menggunakan latar belakang khusus dengan UITextBorderStyleNone:
sumber
Properti over-riding berlaku untuk Perluasan Kelas (Kategori Anonim), tetapi tidak untuk Kategori biasa.
Menurut Apple Docs dengan menggunakan Ekstensi Kelas (Kategori Anonim) Anda dapat membuat antarmuka Pribadi ke kelas publik, sehingga antarmuka pribadi dapat menimpa properti yang terbuka secara publik. yaitu Anda dapat mengubah properti dari hanya-baca menjadi tulis-baca.
Kasus penggunaan untuk ini adalah saat Anda menulis pustaka yang membatasi akses ke properti publik, sementara properti yang sama memerlukan akses baca tulis penuh di dalam pustaka.
Tautan Apple Docs: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html
Cari " Gunakan Ekstensi Kelas untuk Menyembunyikan Informasi Pribadi ".
Jadi teknik ini berlaku untuk Ekstensi Kelas, tetapi tidak untuk Kategori.
sumber
Kategori adalah hal yang baik, tetapi dapat disalahgunakan. Saat menulis kategori, seharusnya Anda sebagai prinsip TIDAK menerapkan ulang metode yang ada. Melakukannya dapat menyebabkan efek samping yang aneh karena Anda sekarang menulis ulang kode yang bergantung pada kelas lain. Anda bisa merusak kelas yang diketahui, dan akhirnya membalik debugger Anda. Ini hanyalah pemrograman yang buruk.
Jika Anda perlu melakukannya, Anda benar-benar harus membuat subkelasnya.
Kemudian saran dari swizzling, itu adalah NO-NO-NO yang besar bagi saya.
Menggesernya saat runtime adalah NO-NO-NO yang lengkap.
Anda ingin pisang terlihat seperti jeruk, tetapi hanya saat runtime? Jika Anda menginginkan jeruk, tulislah jeruk.
Jangan membuat tampilan pisang dan bertindak seperti jeruk. Dan lebih buruk lagi: jangan ubah pisang Anda menjadi agen rahasia yang diam-diam akan menyabotase pisang di seluruh dunia untuk mendukung jeruk.
Astaga!
sumber
Saya mengalami masalah ini ketika saya menerapkan metode delegasi dalam kategori daripada kelas utama (meskipun tidak ada implementasi kelas utama). Solusi bagi saya adalah memindahkan dari file header kelas utama ke file header kategori. Ini berfungsi dengan baik
sumber