是否可以从另一个类调用一个消息?

时间:2012-02-15 21:10:46

标签: objective-c

我一直在撞墙,试图判断是否可以调用另一个类中定义的函数。不幸的是,我对Objective C的了解有限,使我无法得到满意的答案。基本上,我有一个名为Caller的类和一个名为Functions的不同类,我想在运行时挂钩。类Functions将定义调用者在运行时将引用的所有函数。 这是完整的代码:

--- 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为0.如果我使Caller类继承自Functions类,则程序将像魅力。但是我的Functions类必须独立于Caller类。有工作吗?

1 个答案:

答案 0 :(得分:3)

+instanceMethodSignatureForSelector:返回nil,因为Caller没有这样的方法 - 它是在另一个类中实现的,此时您无法使用给定的数据知道。

相反,您可以稍后从目标中检索方法签名,例如:

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