Apa yang setara dengan Objective-C untuk "toString ()", untuk digunakan dengan NSLog?

170

Apakah ada metode yang bisa saya timpa di kelas khusus saya sehingga kapan

      NSLog(@"%@", myObject) 

disebut, itu akan mencetak bidang (atau apa pun yang saya anggap penting) dari objek saya? Saya kira saya sedang mencari setara Objective-C dari Jawa toString().

George Armhold
sumber

Jawaban:

250

Ini adalah descriptionmetode instan, dinyatakan sebagai:

- (NSString *)description

Berikut ini contoh implementasi (terima kasih kepada grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}
zakovyrya
sumber
5
Catatan jika Anda menggunakan CoreData, descriptionproperti dicadangkan ... dan akan memberikan informasi debug yang berguna! Dalam hal ini, Anda harus membuat nama metode unik Anda sendiri.
Nuthatch
Apakah debugDescriptionjuga dipesan? Meskipun saya pikir DebugDescriptionseharusnya digunakan oleh debugger seperti LLDB.
MaddTheSane
36

Tambahkan ini ke @implementationkelas Foto Anda:

- (NSString *)description {
   return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
}
grahampark
sumber
24

Anda dapat mengganti metode deskripsi NSObject:

- (NSString *)description

Mengenai masalah logging saya merekomendasikan posting blog ini untuk login yang lebih baik di Objective-C.

teh celup
sumber
4
Bukankah ini metode statis? Saya ingin ini beroperasi pada objek daripada kelas. Sebagai contoh, jika saya memiliki kelas "Foto", dengan bidang "nama" dan "penulis", saya ingin NSLog mencetak bidang-bidang tersebut saat ditugaskan di objek.
George Armhold
2
Ya - terlihat dengan baik - Saya menekan tombol yang salah. Saya jelas harus lebih memperhatikan ketika bukti membaca jawaban saya. Untungnya seseorang memiliki mata mereka pada bola :-)
teabot
13

Ada dua fungsi yang bisa Anda gunakan.

- (NSString*)description

Ini akan ditampilkan ketika Anda meletakkan objek Anda sebagai, IE parameter untuk NSLog. Fungsi deskripsi lainnya adalah:

- (NSString*)debugDescription

Ini akan dipanggil ketika Anda melakukannya po anInstanceOfYourClassdi jendela perintah debug. Jika kelas Anda tidak memiliki debugDescriptionfungsi, maka hanya descriptionakan dipanggil.

Perhatikan bahwa kelas dasar NSObjectmemang telah descriptiondiimplementasikan, tetapi ini cukup sederhana: hanya menampilkan alamat objek. Inilah sebabnya saya menyarankan Anda menerapkan descriptiondi kelas mana pun Anda ingin mendapatkan info, terutama jika Anda menggunakan descriptionmetode dalam kode Anda. Jika Anda menggunakannya descriptiondalam kode Anda, saya sarankan Anda menerapkan debugDescriptionjuga, juga membuat debugDescriptionlebih banyak verbose.

MaddTheSane
sumber
1

Ini akan menampilkan suara yang tersedia:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
grigb
sumber