リフレクション

Cocoaに関するヌマタメモ
2008年11月29日 23:34

/usr/include/objc/objc-class.h に必要な関数宣言がある。

- (void)doReflectionForClass:(Class)aClass {
    void *iterator = NULL;
    struct objc_method_list *methodList;
    
    while (methodList = class_nextMethodList(aClass, &iterator)) {
        for (int i = 0; i < methodList->method_count; i++) {
            SEL selector = methodList->method_listi.method_name;
            NSLog(@"Selector: %@", NSStringFromSelector(selector));
        }
    }
}

ちなみに、変数は構造体のメンバとして管理されているらしく、取得するのは無理っぽい。というのはウソで、Class(構造体?)がちゃんと保持しているらしい。

struct objc_ivar_list *ivars = aClass->ivars;
if (ivars) {
    for (int i = 0; i < ivars->ivar_count; i++) {
        Ivar ivar = ((struct objc_ivar_list *) ivars->ivar_list)i;
        char *name = ivar->ivar_name;
        char *type = ivar->ivar_type;
        int offset = ivar->ivar_offset;
    }
}

参考資料

コメントを書く


トラックバックはありません。

トラックバックURL: http://numata.designed.jp/mt-tb.cgi/83