我一直在撞墙,试图判断是否可以调用另一个类中定义的函数。不幸的是,我对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
类。有工作吗?
答案 0 :(得分:3)
+instanceMethodSignatureForSelector:
返回nil
,因为Caller
没有这样的方法 - 它是在另一个类中实现的,此时您无法使用给定的数据知道。
相反,您可以稍后从目标中检索方法签名,例如:
@implementation Caller
// ...
- (void)invokeWithTarget:(id)target {
NSMethodSignature *sig = [target methodSignatureForSelector:sel_];
// ...
}