gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:15:40 25 4
gpt4 key购买 nike

[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], &c) 不会返回在它的父类(super class)中定义的属性,所以 super-dealloc 链不能很好地工作。因此,我不想传递 [self class],而是想传递调用特定 dealloc 方法的类。

最佳答案

我认为没有直接的方法可以做到这一点,但您可以使用当前类调用 class_getMethodImplementation_stret 以获取将要调用的方法的函数指针。然后走你的父类(super class),用它们调用相同的函数,直到它返回不同的东西。前一个父类(super class)将为您的类提供实现。

编辑:抱歉,我可能看错了问题。如果您正在寻找层次结构中定义具有该签名的方法的第一个父类(super class),那么您可以遍历调用 respondsToSelector: 的父类(super class),直到其中一个不调用为止。我上面描述的方法是找到提供继承的实现的父类(super class),而不是定义

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

关于objective-c - 如何获取定义方法的类,而不是调用方法的实例的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10617258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com