如何获取定义方法的类,而不是调用该方法的实例的类?

时间:2012-05-16 11:07:29

标签: objective-c ios reflection

[self class]返回被调用方法实例的Class,但有没有办法获得定义方法的Class?假设B类扩展A,而B是B的实例,我想在A中使用一个返回A而不是B的方法,即使从b调用也是如此。

编辑:

我尝试创建一个具有 - (void)releaseProperties方法的NSObject类,该方法获取该类中定义的所有属性,并为非只读对象属性设置nil。

- (void)releaseProperties {
    unsigned int c = 0;
    objc_property_t *properties = class_copyPropertyList([self class], &c);

    for(unsigned int i = 0; i < c; i++) {
        objc_property_t property = properties[i];
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
        NSString *propertyType = [NSString stringWithUTF8String:property_getAttributes(property)];

        if([propertyType hasPrefix:@"T@"] // is an object
           && [propertyType rangeOfString:@",R,"].location == NSNotFound // not readonly
           ) {
            [self setValue:nil forKey:propertyName];
            NSLog(@"%@.%@ = %@", NSStringFromClass(cls), propertyName, [self valueForKey:propertyName]);
        }
    }
    free(properties);
}

我想在dealloc方法中使用此方法,但class_copyPropertyList([self class],&amp; c)不会返回在其超类中定义的属性,因此super-dealloc链不能很好地工作。所以,我没有传递[self class],而是想传递调用特定dealloc方法的类。

3 个答案:

答案 0 :(得分:2)

我认为没有直接的方法可以执行此操作,但您可以使用当前类调用class_getMethodImplementation_stret来获取将被调用的方法的函数指针。然后走你的超类,用它们调用相同的函数,直到它返回不同的东西。上一个超类将是为您的类提供实现的超类。

编辑:抱歉,我可能误解了这个问题。如果您正在寻找层次结构中定义具有该签名的方法的第一个超类,那么您可以只调用调用respondsToSelector:的超类,直到其中一个超类没有。我上面描述的方法是找到提供继承的实现的超类,而不是定义

例如,类A可以定义foo:,然后类B(它是A的子类)可以覆盖它,然后是类C (这是B的子类)可以询问foo:来自何处。如果你想要提供定义的类,你需要A,并且应该使用我描述的第二种方法。如果你想要提供实现的类,你需要B并且应该使用我描述的第一种方法。

答案 1 :(得分:1)

我觉得[super class]可能适合你。

如果你在B中打电话给“[super ...”(填写你想要打电话的空白),你就会调用一个住在A中的方法。

答案 2 :(得分:0)

A类可以提供如下方法:

- (Class) classA
{
    return [A class];
}

这不是一般性的,但你的问题坚持一个不可推广的答案。

这是一件非常奇怪的事情。它表明您的设计存在问题。我可以问你为什么要这样吗?你想解决什么问题?