Что является эквивалентом Objective C для toString (), для использования с NSLog?


170

Есть ли метод, который я могу переопределить в моих пользовательских классах, чтобы при

      NSLog(@"%@", myObject) 

называется, он будет печатать поля (или что я считаю важным) моего объекта? Я думаю, что я ищу Objective-C эквивалент Java toString().

Ответы:


250

Это descriptionметод экземпляра, объявленный как:

- (NSString *)description

Вот пример реализации (спасибо grahamparks):

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

5
Обратите внимание, что если вы используете CoreData, descriptionсвойство зарезервировано ... и предоставит полезную информацию об отладке! В этом случае вам нужно придумать свое собственное уникальное имя метода.
Поползень

Есть debugDescriptionтакже зарезервирован? Хотя я думаю, что DebugDescriptionпредполагается использовать отладчик, как LLDB.
MaddTheSane

36

Добавьте это к @implementationвашему классу Фото:

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

24

Вы можете переопределить метод описания NSObject:

- (NSString *)description

На предмет ведения журнала я рекомендую этот пост в блоге для лучшей регистрации в Objective-C.


4
Разве это не статический метод? Я хотел бы, чтобы это воздействовало на объекты, а не на класс. Например, если у меня есть класс «Фото» с полями «имя» и «автор», я бы хотел, чтобы NSLog печатал эти поля по мере их назначения в объекте.
Джордж Армгольд

2
Да - хорошо заметили - я нажал не ту клавишу. Я явно должен уделять больше внимания при прочтении моих ответов. К счастью, кто-то
положил

13

Есть две функции, которые вы можете использовать.

- (NSString*)description

Это будет отображаться, когда вы помещаете свой объект как, IE параметр для NSLog. Другая функция описания:

- (NSString*)debugDescription

Это будет вызвано, когда вы делаете po anInstanceOfYourClassв окне команды отладки. Если у вашего класса нет debugDescriptionфункции, то просто descriptionбудет вызван.

Обратите внимание , что базовый класс NSObjectделает уже descriptionреализованы, но это довольно скелетное: он отображает только адрес объекта. Вот почему я рекомендую вам реализовать его descriptionв любом классе, из которого вы хотите получить информацию, особенно если вы используете descriptionметод в своем коде. Если вы действительно используете descriptionв своем коде, я предлагаю вам также реализовать debugDescription, также делая debugDescriptionболее многословным.


1

Это выведет доступные голоса:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.