2009-07-09 5 views
164

Есть ли способ, что я могу переопределить в моих пользовательских классах, так что, когдаЧто такое эквивалент Objective-C для «toString()», для использования с NSLog?

 NSLog(@"%@", myObject) 

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

ответ

240

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

- (NSString *)description 

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

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

Обратите внимание, что если вы используете CoreData, свойство 'description' [зарезервировано] (http://stackoverflow.com/questions/4717519/why-cant-i-use- description-as-an-attribute-name-for-a-core-data-entity) ... и предоставит полезную информацию для отладки! В этом случае вам нужно придумать свое собственное уникальное имя метода. – Nuthatch

+0

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

24

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

- (NSString *)description 

По вопросу протоколирования я рекомендую этот blog post для лучших лесозаготовок в Objective-C.

+4

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

+2

Да - хорошо пятнистый - я нажал неправильный ключ. Я, очевидно, должен уделять больше внимания при проверке моих ответов. К счастью, кто-то прицелился в мяч :-) – teabot

34

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

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

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

- (NSString*)description 

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

- (NSString*)debugDescription 

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

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

1

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

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