Objective-C tương đương với đối với những gì toString (), để sử dụng với NSLog là gì?


170

Có một phương thức mà tôi có thể ghi đè trong các lớp tùy chỉnh của mình để khi

      NSLog(@"%@", myObject) 

được gọi, nó sẽ in các trường (hoặc bất cứ điều gì tôi cho là quan trọng) của đối tượng của mình? Tôi đoán tôi đang tìm kiếm tương đương Objective-C của Java toString().

Câu trả lời:


250

Đây là descriptionphương thức cá thể, được khai báo là:

- (NSString *)description

Đây là một ví dụ triển khai (nhờ grahamparks):

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

5
Lưu ý nếu bạn đang sử dụng CoreData, thuộc descriptiontính được bảo lưu ... và sẽ cung cấp thông tin gỡ lỗi hữu ích! Trong trường hợp đó, bạn sẽ cần đưa ra tên phương thức độc đáo của riêng mình.
Nuthatch

Được debugDescriptioncũng reserved? Mặc dù tôi nghĩ rằng DebugDescriptionnó được sử dụng bởi một trình gỡ lỗi như LLDB.
MaddTheSane

36

Thêm phần này vào @implementationlớp Ảnh của bạn:

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

24

Bạn có thể ghi đè phương thức mô tả của NSObject:

- (NSString *)description

Về chủ đề đăng nhập, tôi đề xuất bài đăng trên blog này để đăng nhập tốt hơn vào Objective-C.


4
Đây không phải là một phương pháp tĩnh sao? Tôi muốn điều này hoạt động trên các đối tượng hơn là lớp. Ví dụ: nếu tôi có lớp "Ảnh", với các trường "tên" và "tác giả", tôi muốn NSLog in các trường đó khi chúng được gán trong đối tượng.
George Armkeep

2
Có - phát hiện tốt - Tôi nhấn phím sai. Tôi rõ ràng nên chú ý hơn khi bằng chứng đọc câu trả lời của tôi. Rất may có ai đó đã để mắt đến quả bóng :-)
teabot

13

Có hai chức năng mà bạn có thể sử dụng.

- (NSString*)description

Điều này sẽ được hiển thị khi bạn đặt đối tượng của mình là, IE một tham số cho NSLog. Các chức năng mô tả khác là:

- (NSString*)debugDescription

Điều này sẽ được gọi khi bạn làm po anInstanceOfYourClasstrong cửa sổ lệnh gỡ lỗi. Nếu lớp của bạn không có debugDescriptionchức năng, thì nó descriptionsẽ được gọi.

Lưu ý rằng lớp cơ sở NSObjectđã descriptionthực hiện, nhưng nó khá đơn giản: nó chỉ hiển thị địa chỉ của đối tượng. Đây là lý do tại sao tôi khuyên bạn nên triển khai descriptiontrong bất kỳ lớp nào bạn muốn lấy thông tin ra, đặc biệt nếu bạn sử dụng descriptionphương thức trong mã của mình. Nếu bạn sử dụng descriptionmã của mình, tôi khuyên bạn cũng nên thực hiện debugDescription, cũng làm cho debugDescriptiondài dòng hơn.


1

Điều này sẽ tạo ra các tiếng nói có sẵn:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.