Subclass Objective-C类没有与超类连接?

时间:2014-11-02 20:40:21

标签: objective-c cocoa objective-c-runtime cydia-substrate simbl

我正在为Spotlight编写SIMBL插件,我正在尝试创建内部Spotlight类型的子类。虽然我可以使用class-dump直接从可执行文件中获取标题,但我没有要链接的静态库,因此编译其中一个内部类的子类失败(即使这些类可用于运行)。我一直在subclassing classes at runtime关注Mike Ash的指示,但这很不方便。有没有办法在链接时没有超类可用的情况下创建Objective-C类的子类?

1 个答案:

答案 0 :(得分: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上声明一个类别(或者在您的实现中选择继承的超类)来实现。< / p>