1

我正在为 Spotlight 编写SIMBL插件,并且正在尝试创建内部 Spotlight 类型的子类。虽然我可以使用class-dump直接从可执行文件中获取标头,但我没有要链接的静态库,因此编译其中一个内部类的子类会失败(即使这些类在运行时可用)。我一直在遵循 Mike Ash 关于在运行时继承类的说明,但这很不方便。有什么方法可以创建一个 Objective-C 类的子类,而超类在链接时不可用?

4

1 回答 1

0

这是完全有可能的,而且实际上并不难做到。这是一个使用 NSValue 的简单示例:

@interface MySubclass : NSObject

-(void) someMethod;

@end

@implementation MySubclass

+(void) load {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"

    class_setSuperclass(self, NSClassFromString(@"NSValue"));

#pragma clang diagnostic pop
}

-(void) someMethod {
    NSLog(@"%@", [self superclass]);
}

-(const char *) objCType {
    return @encode(int);
}

-(void) getValue:(void *)value {
    if (value) {
        *((int *) value) = 10;
    }
}

@end

int main() {
    MySubclass *theSubclass = [MySubclass new];
    [theSubclass someMethod];

    NSLog(@"%i", [theSubclass isKindOfClass:[NSValue class]]);
}

class_setSuperclass,虽然已弃用,但仍具有 OS X 10.10 的实现,并且可以在类注册后完成。但是,我还没有完全探讨在创建该类的实例之后更改该类的超类的影响,因此,如果您要在过去的任何时候执行此操作+load+initialize.

这可能使调用方法变得困难super,但这可以通过简单地声明一个类别来解决NSObject(或您在实现中选择继承的任何超类)。

于 2015-02-23T20:19:16.800 回答