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

Objective c 在运行时解析实例方法时确定参数类型,objective-c,objective-c-runtime,Objective C,Objective C Runtime,我正在使用resolveInstanceMethod:实现动态属性getter/setters: 参考号 我希望能够通过将非对象类型“装箱”到NSNumbers中来支持使用此常规模式的非对象类型(例如枚举和整数)。为此,我需要确定将传递到setter中的类型 这可能吗?我已经尽可能地扩展了我对Obj-C运行时的知识,但我似乎无法找到一种方法来确定传递给setter的值的类型。如果属性仍然在类的接口中声明,则可以从属性本身获取类型编码(但如果没有属性,您就倒霉了,因为选择器不包含类型信息)。然后,

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

参考号

我希望能够通过将非对象类型“装箱”到NSNumbers中来支持使用此常规模式的非对象类型(例如枚举和整数)。为此,我需要确定将传递到setter中的类型


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

如果属性仍然在类的接口中声明,则可以从属性本身获取类型编码(但如果没有属性,您就倒霉了,因为选择器不包含类型信息)。然后,您可以使用特定于目标的程序集以及NSGetSizeAndAlignment对值进行装箱和取消装箱。但是,在我看来,我不能诚实地说这是值得的。@RichardJ.RossIII我确实走了这条路,尽管这不是我的理想情况。实际的混凝土类没有声明任何内容,而是将其发送到arbitrary消息。消息来自具有属性的协议,因此我必须传入协议并使用protocol_getProperty()获取类型编码。如果您在接口中声明了协议,您可以一直迭代类的协议。当然。@RichardJ.RossIII我没有:)。
+ (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];
}