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