将函数地址传递给Objective C中的函数指针

时间:2011-05-21 05:51:45

标签: objective-c

我需要将函数的地址传递给函数pointer.Below是我的代码 试图完成它。我很确定我在某个地方犯了错误,所以我得到了一个  运行时异常。如何将函数的地址传递给函数指针。我是  缺少此代码中的内容。

RS232Msg.h

typedef RS232Msg* (*tpNewMsg)(void);
typedef struct
{
    int         nMessageId;         
    NSString*   szAsciiName;        
    tpNewMsg    pNewMessageFunc;   
} stRs232Struct;   
@interface RS232Msg : NSObject
{
}
@end

RS232Msg.m

@implementation RS232Msg
-(id)initWithRS232Msg:(int)uMessageId withNewMsg:(tpNewMsg)pNewMsg withAsciiName:(const char*)szAsciiName withData:(void*)pData withSize:(size_t)uDataSize
{
 //stmts;
}
@end

RS232Derived.h

@interface RS232MsgRequestSession : RS232Msg{
}

+(RS232Msg*)NewMsg;  

RS232Derived.m

@implementation RS232MsgRequestSession
+(id)FromMsg:(RS232Msg*)pMsg           
{                                                       
    pMsg = [RS232MsgRequestSession alloc];  
    return pMsg;
}             
-(id)init
{   
    if (self = [super initWithRS232Msg:[RS232MsgRequestSession getID] withNewMsg:[RS232MsgRequestSession NewMsg] withAsciiName:NULL withData:&st withSize:sizeof(st)]) {

    }
    return self;
}
@end

当我试图传递函数的地址时发生运行时异常

withNewMsg:
[RS232MsgRequestSession NewMsg]

到initWithRS232Msg中的函数指针pNewMsg() 方法

1 个答案:

答案 0 :(得分:1)

[RS232MsgRequestSession NewMsg]无法获取方法的地址。计算表达式,并将结果对象作为参数传递。虽然有一种方法可以直接访问方法的实现(有关详细信息,请阅读this),但可能有更简单的方法来实现您想要的。

基于选择器的方法

而不是你现在正在做的事情,你可以考虑做这样的事情,

- (id) initWithTarget:(id)aTarget action:(SEL)aSelector ... {
    // save these two for later reference.
}

以后,

if ( [target respondsToSelector:theSelector] ) {
    result = [target performSelector:theSelector];
}

这样你就可以达到你想要的效果。

基于块的方法

说实话,Block正在成为Objective-C的最佳补充。

将typedef更改为typedef RS232Msg* (^tpNewMsg)(void);

现在init方法将成为

-(id)init
{   
    self = [super initWithR232Msg:[RS232MsgRequestSession getID]
                       withNewMsg:^{
                           return [RS232MsgRequestSession NewMsg];
                       }
                    withAsciiName:NULL
                         withData:&st
                         withSize:sizeof(st)]
    if ( self ) {
        // do stuff
    }
    return self;
}
@end