SORU
19 ŞUBAT 2010, Cuma


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
20 ŞUBAT 2010, CUMARTESİ


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
    );
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • audivila

    audivila

    5 HAZİRAN 2009
  • Google Chrome

    Google Chrom

    1 EYLÜL 2008
  • Mr. H

    Mr. H

    1 Temmuz 2012