2009-12-14 21 views
5

Quiero tener una cadena descriptiva para un objeto en Cocoa. Estoy pensando en anular el método de descripción o el método stringValue. ¿Cuál es preferible y por qué? La única directriz que pude encontrar fue in here indicandoanula la descripción o stringValue in cocoa?

Se desaconseja la anulación de la descripción.

¿Es esto de hecho lo que sugeriría? ¿Algún otro punto preferido de anulación?

+1

Su enlace es a la documentación de Datos básicos: ¿desea anular el método de descripción de un objeto NSManagedObject u otra cosa? –

+0

No lo creo, es una subclase de NSObject que contiene datos para un cuadro de delimitación espacial y algunas operaciones sobre eso. La descripción de la cadena es básicamente una lista separada por comas de las coordenadas inferior izquierda y superior derecha. – mvexel

Respuesta

5

description es el camino a seguir, eso es lo que se llama para suministrar representación de cadena de un objeto.

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

Creo que es sugerido por el libro de Hillegass también.

+0

gracias, para el recordatorio Hillegass también;) – mvexel

7

Yo personalmente anulo description en prácticamente todas las subclases que creo. Supongo que, como escribe Tom Duckering en su comentario, su cita solo se aplica a Objetos administrados.

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

También puede reemplazar [NSObject debugDescription] que es llamado por el depurador. Es lo que se llama cuando se usa "imprimir a consola" en el depurador. También puede llamarlo directamente en un NSLog.

Por defecto en la mayoría de las clases debugDescription solo llama a description pero puede hacer que devuelvan cadenas separadas. Es un buen lugar para cargar la salida con detalles.

Las categorías son un buen lugar para estacionar el método tanto para sus clases personalizadas como para las clases existentes. Esto es especialmente útil porque puede incluir la categoría en una compilación de depuración pero excluirla en la versión. Si la categoría no está presente, el código llama al método de clase predeterminado en su lugar.

Tengo una categoría de depuración para UIView que vacía todos los atributos que pude pensar. Si encuentro un error desagradable solo incluyo la categoría y luego puedo ver todo sobre cada vista directamente en la consola del depurador.

4

Para responder a su pregunta desde el otro lado, stringValue es algo completamente diferente: no describe el receptor, es una propiedad de él. Su description personalizado puede incluso incluir el stringValue, o un extracto de él si es largo.

Una diferencia clave es que stringValue es a menudo una propiedad mutable (consulte, por ejemplo, el de NSControl), mientras que description es siempre una propiedad inmutable, calculada bajo demanda.

Cuestiones relacionadas