• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 13:48:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

[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 类],而是传递正在调用特定 dealloc 方法的类。



Best Answer-推荐答案


我认为没有直接的方法可以做到这一点,但是您可以使用当前类调用 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap