Quel est l'équivalent en Objective-C de «toString ()», à utiliser avec NSLog?

170

Existe-t-il une méthode que je peux remplacer dans mes classes personnalisées afin que lorsque

      NSLog(@"%@", myObject) 

est appelé, il imprimera les champs (ou ce que je juge important) de mon objet? Je suppose que je recherche l'équivalent Objective-C de Java toString().

George Armhold
la source

Réponses:

250

C'est la descriptionméthode d'instance, déclarée comme:

- (NSString *)description

Voici un exemple d'implémentation (merci à grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}
zakovyrya
la source
5
Notez que si vous utilisez CoreData, la descriptionpropriété est réservée ... et fournira des informations de débogage utiles! Dans ce cas, vous devrez créer votre propre nom de méthode unique.
Nuthatch
Est debugDescriptionégalement réservé? Bien que je pense qu'il DebugDescriptionest censé être utilisé par un débogueur comme LLDB.
MaddTheSane
36

Ajoutez ceci à la @implementationde votre classe Photo:

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

Vous pouvez remplacer la méthode de description de NSObject:

- (NSString *)description

Au sujet de la journalisation, je recommande ce billet de blog pour une meilleure connexion dans Objective-C.

teabot
la source
4
N'est-ce pas une méthode statique? J'aimerais que cela fonctionne sur des objets plutôt que sur la classe. Par exemple, si j'ai une classe "Photo", avec les champs "nom" et "auteur", j'aimerais que NSLog imprime ces champs tels qu'ils sont assignés dans l'objet.
George Armhold
2
Oui - bien repéré - j'ai appuyé sur la mauvaise touche. Je devrais clairement faire plus attention lors de la relecture de mes réponses. Heureusement, quelqu'un avait l'œil sur la balle :-)
teabot
13

Vous pouvez utiliser deux fonctions.

- (NSString*)description

Cela sera affiché lorsque vous mettez votre objet comme, IE un paramètre pour NSLog. L'autre fonction de description est:

- (NSString*)debugDescription

Cela sera appelé lorsque vous le faites po anInstanceOfYourClassdans la fenêtre de commande de débogage. Si votre classe n'a pas de debugDescriptionfonction, alors juste descriptionsera appelée.

Notez que la classe de base a NSObjectété descriptionimplémentée, mais elle est assez simple: elle n'affiche que l'adresse de l'objet. C'est pourquoi je vous recommande d'implémenter descriptiondans n'importe quelle classe dont vous souhaitez obtenir des informations, en particulier si vous utilisez la descriptionméthode dans votre code. Si vous utilisez descriptiondans votre code, je vous suggère de l'implémenter debugDescriptionégalement, en rendant également debugDescriptionplus verbeux.

MaddTheSane
la source
1

Cela produira les voix disponibles:

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