Objective C İçgözlem/Yansıma
Dahili yöntem, fonksiyon, API, yaygın olarak kabul edilen yol, vs. var. Amaç C oluşturulmuş bir nesne içeriğini dökümü için, özellikle Apple'ın Cocoa/Cocoa-Touch ortamı?
Gibi bir şey yapmak mümkün olmak istiyorum
MyType *the_thing = [[MyType alloc] init];
NSString *the_dump = [the_thing dump]; //pseudo code
NSLog("Dumped Contents: %@", the_dump);
ve nesnenin örnek değişken isimleri ve değerleri, herhangi bir yöntem zamanında çağırmak için kullanılabilir ile birlikte görüntülenir. Kolay bir format okumak için ideal.
Geliştiriciler PHP aşina, temel olarak yansıma fonksiyonları (, ** 4 ** 5) ve OO Yansıma API eşdeğer arıyorum.
CEVAP
GÜNCELLEME:Herkes bu tür şeyler yapmak isteyen Mike Ash's ObjC wrapper for the Objective-C runtime kontrol etmek isteyebilirsiniz.
Bu konuda ne yapabileceğini daha fazla veya daha az
#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);
}
Oradan, kolay elde edilen gerçek değerler bir örneğinin özelliklerini kontrol etmen lazım, eğer onlar ilkel türler veya nesneleri, yani ben çok tembel koyun. Ayrıca miras zincirinin almak için taramak için seçebilirsiniztümözellikleri bir nesne üzerinde tanımlanmış. Sonra yöntemleri kategoriler ve daha fazlası için tanımlanmış... Ama hemen hemen her şey hazır.
İşte yukarıdaki kod UİLabel için döker ne bir alıntı:
{
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
);
}
Objective-C'de bir typedef numaralama ...
Objective-C için bir arada kısayolları...
Nasıl bir dize Objective-C başka bir d...
Objective-C sabitleri...
Yansıma nedir ve neden yararlıdır?...