1

Spotlight 用のSIMBLプラグインを作成しており、内部 Spotlight タイプのサブクラスを作成しようとしています。class-dumpを使用して実行可能ファイルからヘッダーを直接取得できますが、リンクする静的ライブラリがないため、それらの内部クラスの 1 つのサブクラスをコンパイルすると失敗します (実行時にクラスが使用可能になる場合でも)。実行時のクラスのサブクラス化に関する 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

これにより、 on のメソッドを呼び出すことが難しくなる可能性がありますが、 on (または実装で継承するように選択したスーパークラス) をsuper宣言するだけで回避できます。NSObject

于 2015-02-23T20:19:16.800 に答える