2012-02-15 9 views
1

私は、別のクラスで定義された関数を呼び出すことができるかどうかを判断しようとすると、壁に頭を打ちました。残念ながら、Objective Cの私の限られた知識は私が満足のいく答えに達することを妨げました。基本的には、Callerというクラスと、実行時にフックしたいFunctionsという別のクラスがあります。クラスFunctionsには、呼び出し側が実行時に参照するすべての関数が定義されています。 これはその全体がコードです:別のクラスからmsgを呼び出すことはできますか?

--- Caller.h ------------------- 
#import "Functions.h" 
@interface Caller 
{ 
    int callerId; 
    NSMethodSignature *sig; 
    NSInvocation *func; 
} 
@property(retain) NSInvocation* func; 
@end 

--- Caller.m ------------------- 
#import "Caller.h" 
@implementation Caller 
@Synthesize func; 
-(id)initWithFunction: (SEL)f 
{ 
    if (self) 
    { Sig = [Caller instanceMethodSignatureForSelector: f]; 
     func= [NSInvocation invocationWithMethodSignature: Sig];} 
    return self; 
} 
@end 

--- Functions.h ------------------- 
@interface Functions 
-(int)SayHello; 
@end 

--- Functions.m ------------------- 
#import "Functions.h" 
@implementation 
-(int)SayHello 
{ 
    NSLog(@"Hello"); 
    return 0; 
} 

---------main.m----------------- 
#import <Foundation/Foundation.h> 
#import "Caller.h" 
#import "Functions.h" 
int main 
{ 
    NSAutoreleasePool * pool [[NSAutoreleasePool alloc]init]; 
    Functions* ftn = [[Functions alloc]init]; 
    Caller * c = [[Caller alloc]initWithFunction: @selection(SayHello)]; 
    [c.func setTarget:c]; 
    [c.func invoke]; 
    [pool drain]; 
    return 0; 
} 

コードがうまくコンパイルされましたが、instanceMethodSignatureForSelectorは私がFunctionsクラスからCallerクラスの継承を行う場合には、プログラムが動作する0であるため、実行時に、それはエラーが発生しました魔法のように。しかし私の場合はFunctionsクラスはCallerクラスから独立していなければなりません。回避策はありますか?

答えて

3

+instanceMethodSignatureForSelector:Callerにはそのようなメソッドがありません。つまり、その時点で指定されたデータではわからない別のクラスに実装されています。

代わりにあなたが例えば、後でターゲットからのメソッドのシグネチャを取得することができます。:

@implementation Caller 
// ... 
- (void)invokeWithTarget:(id)target { 
    NSMethodSignature *sig = [target methodSignatureForSelector:sel_]; 
    // ... 
} 
+0

はあなたの援助のためにありがとうございました。非常に高く評価!できます! – user1205746

関連する問題