ventajas sirve que programacion para objective lenguaje historia enlazador desventajas descripcion apple antecedentes objective-c properties nslog

objective c - sirve - ¿Hay una manera de registrar todos los valores de propiedad de una instancia de Objective-C?



programacion smalltalk (5)

Ahora hay estos métodos en NSObject :

@interface NSObject (Private) -(id)_ivarDescription; -(id)_shortMethodDescription; -(id)_methodDescription; @end

En veloz:

myObject.perform("_ivarDescription")

Gracias a este artículo

Me preguntaba si hay una forma rápida y fácil de imprimir en el registro todos los diversos valores de las propiedades de mi clase para fines de depuración. Me gustaría saber cuáles son los valores de todos los BOOLs, flotadores, etc.


Las respuestas actuales solo muestran cómo hacerlo para las propiedades. Si desea que se imprima cada variable de instancia, podría hacer algo como lo siguiente.

- (void)logAllProperties { unsigned int count; Ivar *ivars = class_copyIvarList([self class], &count); for (unsigned int i = 0; i < count; i++) { Ivar ivar = ivars[i]; const char *name = ivar_getName(ivar); const char *type = ivar_getTypeEncoding(ivar); ptrdiff_t offset = ivar_getOffset(ivar); if (strncmp(type, "i", 1) == 0) { int intValue = *(int*)((uintptr_t)self + offset); NSLog(@"%s = %i", name, intValue); } else if (strncmp(type, "f", 1) == 0) { float floatValue = *(float*)((uintptr_t)self + offset); NSLog(@"%s = %f", name, floatValue); } else if (strncmp(type, "@", 1) == 0) { id value = object_getIvar(self, ivar); NSLog(@"%s = %@", name, value); } // And the rest for other type encodings } free(ivars); }

Aunque no sugeriría particularmente hacer esto en la práctica, pero si es para fines de depuración, entonces está bien. Puede implementar esto como una categoría en NSObject y mantenerlo en un lugar para su uso al depurar. Si se completa para todas las codificaciones de tipo, podría ser un pequeño método muy agradable.


Lo rápido y sucio sería anular la debugDescription :

-(NSString*)debugDescription { NSString *str = [[NSString alloc] initWithFormat:@"My BOOL 1: %d, My Float: %f", self.myBool, self.myFoat]; return str; }

Por supuesto, si su objeto es complejo, esto podría llevar mucho tiempo.


sí, una forma sería pedir todas las propiedades y luego usar KVC, por ejemplo:

//properties unsigned int cProperties = 0; objc_property_t *props = class_copyPropertyList(self.class, &cProperties); for(int i = 0; i < cProperties; i++) { const char *name = property_getName(props[i]); NSLog(@"%@=%@", name, [self valueForKey:name]; }

una forma alternativa es ir a través de todos los métodos de una clase, obtener el tipo de retorno, invocar e imprimirlo


Esta pregunta parece tener la respuesta a tu pregunta.

Actualizar:

Me puse curioso e hice una categoría:

//Using Xcode 4.5.2 - iOS 6 - LLDB - Automatic Reference Counting //NSObject+logProperties.h @interface NSObject (logProperties) - (void) logProperties; @end //NSObject+logProperties.m #import "NSObject+logProperties.h" #import <objc/runtime.h> @implementation NSObject (logProperties) - (void) logProperties { NSLog(@"----------------------------------------------- Properties for object %@", self); @autoreleasepool { unsigned int numberOfProperties = 0; objc_property_t *propertyArray = class_copyPropertyList([self class], &numberOfProperties); for (NSUInteger i = 0; i < numberOfProperties; i++) { objc_property_t property = propertyArray[i]; NSString *name = [[NSString alloc] initWithUTF8String:property_getName(property)]; NSLog(@"Property %@ Value: %@", name, [self valueForKey:name]); } free(propertyArray); } NSLog(@"-----------------------------------------------"); } @end

#import "NSObject+logProperties.h" en su clase: #import "NSObject+logProperties.h"

y llamar [self logProperties]; a esas propiedades!