Можно ли вызвать сообщение из другого класса? - PullRequest
1 голос
/ 16 февраля 2012

Я стучу головой о стену, пытаясь понять, можно ли вызвать функцию, определенную в другом классе. К сожалению, мои ограниченные знания в Задаче 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 Ответ

3 голосов
/ 16 февраля 2012

+instanceMethodSignatureForSelector: возвращает nil, потому что Caller не имеет такого метода - он реализован в другом классе, который вы не можете знать с данными на данный момент.

Вместо этого вы можете получить сигнатуру метода из цели позже, например ::

@implementation Caller
// ...
- (void)invokeWithTarget:(id)target {
    NSMethodSignature *sig = [target methodSignatureForSelector:sel_];
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...