2009-12-14 5 views
5

Je souhaite avoir une chaîne descriptive pour un objet dans Cocoa. Je pense à surcharger la méthode description ou la méthode stringValue. Lequel est préférable et pourquoi? La seule ligne directrice que j'ai pu trouver était la suivante: in here indiquantoverride description ou stringValue dans le cacao?

Vous n'êtes pas encouragé par la description dominante.

Est-ce bien ce que vous suggéreriez? Tout autre point de dépassement préféré?

+1

Votre lien est à la documentation pour les données de base - voulez-vous remplacer la méthode de description pour un NSManagedObject ou autre? –

+0

Je ne pense pas - c'est une sous-classe NSObject contenant des données pour une boîte englobante spatiale et quelques opérations sur cela. La description de la chaîne est essentiellement une liste séparée par des virgules des coordonnées en bas à gauche et en haut à droite. – mvexel

Répondre

5

description est le chemin à parcourir, c'est ce qu'il est appelé à fournir une représentation de chaîne d'un objet.

- (NSString*)description 
{ 
    return [NSString stringWithFormat:@"%@, %@; %@", a, b, c]; 
} 

Je crois suggéré par le livre de Hillegass ainsi.

+0

merci, pour le rappel Hillegass aussi;) – mvexel

7

Personnellement, je remplace description dans pratiquement toutes les sous-classes que je crée. Je suppose, comme Tom Duckering écrit dans son commentaire, que votre citation ne s'applique qu'aux objets gérés.

- (NSString *)description 
{ 
    return [NSString stringWithFormat:@"%@ <%p>", NSStringFromClass([self class]), self]; 
} 
2

Vous pouvez également remplacer [NSObject debugDescription] qui est appelée par le débogueur. C'est ce qu'on appelle quand on utilise "print to console" dans le débogueur. Vous pouvez également l'appeler directement dans un NSLog.

Par défaut, dans la plupart des classes debugDescription appelle simplement description mais vous pouvez leur demander de renvoyer des chaînes séparées. C'est un bon endroit pour charger la sortie avec des détails.

Les catégories sont un bon endroit pour parquer la méthode à la fois pour vos classes personnalisées et vos classes existantes. Ceci est particulièrement utile car vous pouvez inclure la catégorie dans une version de débogage mais l'exclure dans la version. Si la catégorie n'est pas présente, le code appelle la méthode de classe par défaut à la place.

J'ai une catégorie de débogage pour UIView qui vide tous les attributs que je pouvais penser. Si j'atteins un bug méchant, j'inclus simplement la catégorie et ensuite je peux voir tout sur chaque vue directement dans la console du débogueur.

4

Pour répondre à votre question de l'autre sens, stringValue est quelque chose de tout à fait différent - il ne décrit pas le récepteur, c'est une propriété de celui-ci. Votre description personnalisé peut même inclure le stringValue, ou un extrait s'il est long. Une différence clé est que stringValue est souvent une propriété mutable (voir, par exemple, celle de NSControl), tandis que description est toujours une propriété immuable, calculée sur demande.