Pergunta

Eu tenho certeza que eu apenas estou faltando o ponto aqui e ficar confuso. Alguém pode me dizer como eu poderia escrever uma simples descrição de um objeto que irá imprimir o valor de suas variáveis ??de instância para o console.

Além disso: se houver qualquer forma de apresentar a informação como um bloco (ou seja, se você tivesse 10 Ivars que vai ser uma dor fazê-los todos para retornar um por um)

@interface CelestialBody : NSObject {
    NSString *bodyName;
    int bodyMass;
}

- (NSString *)description { 
    return (@"Name: %@ Mass: %d", bodyName, bodyMass);
}

aplausos -Gary -

Foi útil?

Solução

- (NSString*)description
{
  return [NSString stringWithFormat:@"Name: %@\nMass: %d\nFoo: %@",
     bodyName, bodyMass, foo];
}

Outras dicas

Olhe para a resposta a esta questão . O código é reproduzido abaixo:

unsigned int varCount;

Ivar *vars = class_copyIvarList([MyClass class], &varCount);

for (int i = 0; i < varCount; i++) {
    Ivar var = vars[i];

    const char* name = ivar_getName(var);
    const char* typeEncoding = ivar_getTypeEncoding(var);

    // do what you wish with the name and type here
}

free(vars);

Como Jason escreveu você deve usar stringWithFormat:. Para cadeias de formato com printf como a sintaxe

-(NSString*)description;
{
  return [NSString stringWithFormat:@"Name: %@ Mass: %d", bodyName, bodyMass];
}

Para evitar escrever este uma e outra vez para muitas classes você poderia adicionar uma categoria em NSObject que permite que você inspecione as variáveis ??de instância facilmente. Este será mau desempenho, mas funciona para fins de depuração.

@implementation NSObject (IvarDictionary)

-(NSDictionary*)dictionaryWithIvars;
{
  NSMutableDictionary* dict = [NSMutableDictionary dictionary];
  unsigned int ivarCount;
  Ivar* ivars = class_copyIvarList([self class], &ivarCount);
  for (int i = 0; i < ivarCount; i++) {
    NSString* name = [NSString stringWithCString:ivar_getName(ivars[i])
                                        encoding:NSASCIIStringEncoding];
    id value = [self valueForKey:name];
    if (value == nil) {
      value = [NSNull null];
    }
    [dict setObject:value forKey:name];
  }
  free(vars);
  return [[dict copy] autorelease]; 
}
@end

Com este no lugar descrição de execução é também um pedaço de bolo:

-(NSString*)description;
{
  return [[self dictionaryWithIvars] description];
}

não adicionar esse description como uma categoria em NSObject, ou você pode acabar com recursividade infinita.

Isso não é uma má idéia que você tinha lá, é quase viável também.

// choose a short name for the macro
#define _f(x,...) [NSString stringWithFormat:x,__VA_ARGS__]

...

- (NSString *) description
{
    return _f(@"Name: %@ Mass: %d", bodyName, bodyMass);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top