ACTUALIZACIÓN: Cualquiera que quiera hacer este tipo de cosas puede ser que desee comprobar hacia fuera Mike Ash's ObjC wrapper for the Objective-C runtime.
Esto es más o menos la forma en que iría al respecto:
#import <objc/runtime.h>
. . .
-(void)dumpInfo
{
Class clazz = [self class];
u_int count;
Ivar* ivars = class_copyIvarList(clazz, &count);
NSMutableArray* ivarArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* ivarName = ivar_getName(ivars[i]);
[ivarArray addObject:[NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding]];
}
free(ivars);
objc_property_t* properties = class_copyPropertyList(clazz, &count);
NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* propertyName = property_getName(properties[i]);
[propertyArray addObject:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
}
free(properties);
Method* methods = class_copyMethodList(clazz, &count);
NSMutableArray* methodArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
SEL selector = method_getName(methods[i]);
const char* methodName = sel_getName(selector);
[methodArray addObject:[NSString stringWithCString:methodName encoding:NSUTF8StringEncoding]];
}
free(methods);
NSDictionary* classDump = [NSDictionary dictionaryWithObjectsAndKeys:
ivarArray, @"ivars",
propertyArray, @"properties",
methodArray, @"methods",
nil];
NSLog(@"%@", classDump);
}
A partir de ahí, es fácil de obtener los valores reales de las propiedades de un ejemplo, pero hay que comprobar para ver si son primitiva tipos u objetos, por lo que era demasiado flojo para ponerlo. También puede optar por escanear la cadena de herencia para obtener todas las propiedades definidas en un objeto. Luego hay métodos definidos en categorías, y más ... Pero casi todo está disponible.
He aquí un extracto de lo que el código anterior deja por UILabel:
{
ivars = (
"_size",
"_text",
"_color",
"_highlightedColor",
"_shadowColor",
"_font",
"_shadowOffset",
"_minFontSize",
"_actualFontSize",
"_numberOfLines",
"_lastLineBaseline",
"_lineSpacing",
"_textLabelFlags"
);
methods = (
rawSize,
"setRawSize:",
"drawContentsInRect:",
"textRectForBounds:",
"textSizeForWidth:",
. . .
);
properties = (
text,
font,
textColor,
shadowColor,
shadowOffset,
textAlignment,
lineBreakMode,
highlightedTextColor,
highlighted,
enabled,
numberOfLines,
adjustsFontSizeToFitWidth,
minimumFontSize,
baselineAdjustment,
"_lastLineBaseline",
lineSpacing,
userInteractionEnabled
);
}
Me pregunto la misma pregunta que hay algunos días. gracias por esta pregunta. –
Sí, gran pregunta. Una de las mayores ventajas de ObjC sobre otros lenguajes similares es su increíble sistema de tiempo de ejecución dinámico que le permite hacer cosas increíbles como esta. Desafortunadamente, las personas rara vez lo utilizan en todo su potencial, así que felicitaciones por enseñarle a la comunidad SO con su pregunta. – rpj
He creado una biblioteca liviana para tratar con la reflexión [OSReflectionKit] (https://github.com/iAOS/OSReflectionKit). Usando esta biblioteca, puede simplemente llamar a [the_thing fullDescription]. –