GÜNCELLEME: bu tarz şeyleri yapmak isteyen Herkes Mike Ash's ObjC wrapper for the Objective-C runtime kontrol etmek isteyebilirsiniz. Oradan
#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);
}
, bir örneğin özelliklerinin gerçek değerleri elde etmek kolay, ama onlar ilkel olup olmadığını görmek için kontrol etmek zorunda:
Bu daha fazla veya bu konuda gitmek istiyorum nasıl azdır türleri veya nesneleri, ben de koymak için çok tembel oldu. Ayrıca bir nesne üzerinde tanımlanan özellikleri tüm almak için miras zincirini taramak için seçebilirsiniz. Daha sonra kategoriler üzerinde tanımlanmış yöntemler var ve daha fazlası ... Ama hemen hemen her şey hazır. o tüm özelliklerini damping çalışır -
İşte
{
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
);
}
Aynı sorunun birkaç gün olduğunu merak ediyorum. Bu soru için teşekkür ederim. –
Evet, harika bir soru. ObjC'nin diğer benzer dillere göre en büyük avantajlarından biri, bunun gibi harika şeyler yapmanıza olanak tanıyan inanılmaz dinamik çalışma zamanı sistemidir. Ne yazık ki, insanlar nadiren onu tam potansiyeline kullanırlar, bu yüzden SO topluluğunu bu konuyla ilgili öğretmenin kudosudur. – rpj
Yansıma ile ilgilenmek için hafif bir kütüphane oluşturdum [OSReflectionKit] (https://github.com/iAOS/OSReflectionKit). Bu kütüphaneyi kullanarak [the_thing fullDescription] 'ı arayabilirsiniz. –