5

私はObj-cランタイムリファレンスにあるこのメソッドを試しています

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

次のような新しいメソッドを追加したいと思います。

- [AClass drawWithFrame:(NSRect)rect inView:(id)view]

これまで、C関数を作成しました。

void drawWithFrameInView(id this, SEL this_cmd, NSRect frame, id view){
...
} 

今、私はする準備ができています:

BOOL success = class_addMethod(NSClassFromString(@"AClass"), 
                               @selector(drawWithFrame:inView:), 
                               (IMP)drawWithFrameInView, 
                               "v@:@:@:");

しかし、success決して「はい」ではありません。私は、より単純な署名を持つメソッドで同じアプローチを試しましたが、うまくいきました。したがって、問題は最後のパラメータだと思います。"v@:@:@:"

この場合、新しいメソッドを機能させるには何を渡す必要がありますか?

4

1 に答える 1

8

これは機能します:

char *types = [[NSString stringWithFormat:@"v@:%s@", @encode(NSRect)] UTF8String];

BOOL success = class_addMethod(NSClassFromString(@"MyClass"), 
                               @selector(drawWithFrame:inView:), 
                               (IMP)drawWithFrameInView, 
                               types);

コードが機能しない理由は、がオブジェクトNSRectはなく、へのであるためです。typedefstruct

タイプエンコーディングの詳細については、こちらをご覧ください。

于 2011-07-25T05:24:02.977 に答える