NSLoger l'adresse mémoire d'un objet dans la méthode de description remplacée

116

Je remplace la méthode de description d'un objet. J'ai besoin de savoir comment imprimer l'adresse mémoire de l'objet pour remplacer {???} dans le code ci-dessous:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@",
            {???}, self.parameterOne, self.paramterTwo];
}

Je veux qu'il s'imprime dans la console comme ceci:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages
Undistraction
la source

Réponses:

212

Pour imprimer l'adresse, utilisez le %pspécificateur de format et le pointeur automatique:

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}
Vladimir
la source
6
l'utilisation de self avec le spécificateur '% @' provoquerait en effet une récursion car cela rendrait la méthode -description appelée à nouveau. Le spécificateur% p sort juste l'adresse du pointeur
Vladimir
3
J'ai tendance à [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- l'adresse finit là-dedans parce NSObjectqu'elle l'a, mais vous ne jetez pas non plus tout ce que vous avez décidé d'être pertinent pour le débogage dans les superclasses dont vous héritez.
Tommy
7
Note complémentaire: %pattend un pointeur de type void *, vous devez fonte selfrevenir à void *, un comportement non défini d' autre se produit.
4
@ user529758: pas besoin de cast, pas de comportement indéfini. void *et idsont intérieurement presque les mêmes, et dans ce cas, il n'y a aucune différence que vous le jetiez void *ou non.
Michael
1
Vous devez mettre le symbole '&' avant l'argument 'self'
Artyom Devyatov
6

La méthode la plus simple consiste à utiliser la super description

- (NSString *)description
{
    return [NSString stringWithFormat:@"%@ Area: %@, %@", [super description], self.identifier, self.name];
}

Ainsi, dans le cas de cet objet modèle qui est une sous-classe de NSObject, vous pouvez éviter le travail supplémentaire et la mémoire %p.

Utilisation manuelle de NSStringWithClass () et% p

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

Donc, dans le cas d'un modèle objet dans lequel vous avez un implémenteur concret dérivé de cette classe, vous montrez le nom de classe correct.

Cameron Lowell Palmer
la source