在运行时将Objective-C方法添加到类中

 卢代马OR撸代码 发布于 2023-02-08 15:50

我试图在旧系统上支持10.9中新添加的NSColor方法.10.9之前我在一个类别中有这些允许我统一Mac和iOS之间的代码.现在10.9有这些方法,无论我在哪里使用它,我都会得到奇怪的绘图.我想动态地将这些方法添加到较旧的运行时,并且我已经找到了几个使用class_addMethod来完成它的参考.问题是,即使addMethod返回成功,也不会调用这些方法.

NSColor *
fColorWithWhite(id self, SEL _cmd, float white, float alpha) {
    return [NSColor colorWithDeviceWhite: white
                                   alpha: alpha];
}

NSColor *
fColorWithRedGreenBlue(id self, SEL _cmd, float red, float green, float blue, float alpha) {
    return [NSColor colorWithDeviceRed: red
                                 green: green
                                  blue: blue
                                 alpha: alpha];
}

+ (void)addLegacySupport {
    Class class = NSClassFromString(@"NSColor");

    BOOL success = class_addMethod(class, @selector(colorWithWhite:alpha:), (IMP)fColorWithWhite, "@@:ff");
    NSLog(@"colorWithWhite:alpha: - %i", success);

    success = class_addMethod(class, @selector(colorWithRed:green:blue:alpha:), (IMP)fColorWithRedGreenBlue, "@@:ffff");
    NSLog(@"colorWithRed:green:blue:alpha: - %i", success);
}

任何指针都将非常感激.

2 个回答
  • class_addMethod()向类添加实例方法.您正在尝试添加类方法.因此,您需要将方法添加到元类(类是其元类的实例),您可以通过object_getClass()使用类作为参数来调用它:

    Class metaclass = object_getClass(NSClassFromString(@"NSColor"));
    
    BOOL success = class_addMethod(metaclass, @selector(colorWithWhite:alpha:), (IMP)fColorWithWhite, "@@:ff");
    

    2023-02-08 15:53 回答
  • 您正在尝试添加类方法。您需要将它们添加到元类。

    Class meta_cls = objc_getMetaClass("NSColor");
    

    2023-02-08 15:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有