Saat ini, kami mendefinisikan diri kami mekanisme log yang diperluas untuk mencetak nama kelas dan nomor baris sumber log.
#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
__LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
Misalnya, ketika saya memanggil NCLog (@ "Hello world"); Outputnya adalah:
<ApplicationDelegate:10>Hello world
Sekarang saya juga ingin keluar nama metode seperti:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Jadi, ini akan membuat proses debug kita menjadi lebih mudah ketika kita dapat mengetahui metode mana yang dipanggil. Saya tahu bahwa kami juga memiliki debugger Xcode tetapi terkadang, saya juga ingin melakukan debugging dengan logout.
objective-c
c
iphone
debugging
vodkhang
sumber
sumber
iPhone
proyek terakhir saya , saya benar-benar melakukan ini secara manual. Senang melihat jawaban untuk ini.Jawaban:
Cepat 3 dan lebih tinggi
sumber
NSLog(@"%@", NSStringFromSelector(_cmd))
, jika Anda akan menggunakan_cmd
, karena AFAIK Apple mendeklarasikan_cmd
sebagai tipeSEL
, bukan C-string. Hanya karena kebetulan diterapkan sebagai string-C (pada versi Mac OS X dan iPhone OS saat ini) tidak berarti Anda harus menggunakannya dengan cara itu, karena Apple dapat mengubahnya dalam pembaruan OS.[self doSomething:arg1 somethingElse:arg2]
get diubah menjadi panggilan fungsi Cobjc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);
. Parameter kedua dariobjc_msgSend()
achar*
. Ingatlah bahwa karena runtime Objective-C adalah dinamis, itu sebenarnya menggunakan tabel pencarian untuk mengetahui metode yang memanggil kelas sehingga char * nyaman karena metode direpresentasikan sebagai string dalam tabel pencarian.print("\(#function)")
Untuk secara teknis menjawab pertanyaan Anda, Anda ingin:
Atau Anda juga bisa:
sumber
__FUNCTION__
dan itu cukup setara juga tersedia di C-fungsi.__FUNCTION__
juga menyertakan nama kelastl; dr
Detail
Apple memiliki halaman Tanya Jawab Teknis: QA1669 - Bagaimana saya bisa menambahkan informasi konteks - seperti metode atau nomor baris saat ini - ke pernyataan logging saya?
Untuk membantu pencatatan:
_cmd
Seperti jawaban lain yang ditunjukkan, untuk sekadar mendapatkan nama metode saat ini, hubungi:
Untuk mendapatkan nama metode saat ini dan nomor baris saat ini, gunakan dua makro ini
__func__
dan__LINE__
seperti yang terlihat di sini:Contoh lain ... Cuplikan kode yang saya simpan di Perpustakaan Cuplikan Kode Xcode:
... dan TRACE bukannya ERROR ...
... dan yang lebih panjang menggunakan deskripsi kode lunak yang meneruskan nilai (
[rows count]
) ...Makro preprosesor untuk logging
Perhatikan penggunaan sepasang karakter garis bawah di sekitar kedua sisi makro.
Ekspresi untuk logging
Kerangka Penebangan
Beberapa kerangka kerja logging dapat membantu mendapatkan metode atau nomor baris saat ini juga. Saya tidak yakin, karena saya telah menggunakan kerangka kerja logging yang bagus di Jawa ( SLF4J + LogBack ) tetapi tidak untuk Cocoa.
Lihat pertanyaan ini untuk tautan ke berbagai kerangka kerja penebangan Kakao.
Nama Pemilih
Jika Anda memiliki variabel Pemilih ( SEL ), Anda dapat mencetak nama metode ("message") dengan salah satu dari dua cara seperti yang dijelaskan oleh posting blog Codec ini :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
Informasi ini diambil dari halaman Apple doc tertaut pada 2013-07-19. Halaman itu terakhir diperbarui 2011-10-04.
sumber
sel_getName(SEL)
karena SEL adalah tipe buram dan mungkin tidak selalu menjadichar *
sumber
Ini sebenarnya sesederhana:
Untuk beberapa alasan, iOS mengizinkan _cmd untuk diteruskan sebagai karakter literal tanpa peringatan kompilasi. Siapa tahu
sumber
Dalam Swift 4:
tes func () {
}
test () // cetak nilai "test ()"
sumber