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