在运行时解析实例方法时确定参数类型

时间:2014-04-02 04:09:40

标签: objective-c objective-c-runtime

我正在使用resolveInstanceMethod:实现动态属性getter / setter:

ref https://stackoverflow.com/a/13646650/132087

+ (BOOL)resolveInstanceMethod:(SEL)aSEL {
    if ([NSStringFromSelector(aSEL) hasPrefix:@"set"]) {
        class_addMethod([self class], aSEL, (IMP)setPropertyIMP, "v@:@");
    } else {
        class_addMethod([self class], aSEL,(IMP)propertyIMP, "@@:");
    }
    return YES;
}

static id propertyIMP(id self, SEL _cmd) {
    return [[self properties] valueForKey:NSStringFromSelector(_cmd)];
}

static void setPropertyIMP(id self, SEL _cmd, id aValue) {

    id value = [aValue copy];
    NSMutableString *key = [NSStringFromSelector(_cmd) mutableCopy];

    // delete "set" and ":" and lowercase first letter
    [key deleteCharactersInRange:NSMakeRange(0, 3)];
    [key deleteCharactersInRange:NSMakeRange([key length] - 1, 1)];
    NSString *firstChar = [key substringToIndex:1];
    [key replaceCharactersInRange:NSMakeRange(0, 1) withString:[firstChar lowercaseString]];

    [[self properties] setValue:value forKey:key];
}

我希望能够通过"拳击"使用这种通用模式来支持非对象类型(例如枚举和整数)。他们在NSNumbers里面。为此,我需要确定将 type 传递给setter。

这可能吗?我尽可能地了解Obj-C运行时的知识,但我似乎无法确定一种方法来确定传递给setter的值的类型。

0 个答案:

没有答案