我需要将函数的地址传递给函数pointer.Below是我的代码 试图完成它。我很确定我在某个地方犯了错误,所以我得到了一个 运行时异常。如何将函数的地址传递给函数指针。我是 缺少此代码中的内容。
typedef RS232Msg* (*tpNewMsg)(void);
typedef struct
{
int nMessageId;
NSString* szAsciiName;
tpNewMsg pNewMessageFunc;
} stRs232Struct;
@interface RS232Msg : NSObject
{
}
@end
@implementation RS232Msg
-(id)initWithRS232Msg:(int)uMessageId withNewMsg:(tpNewMsg)pNewMsg withAsciiName:(const char*)szAsciiName withData:(void*)pData withSize:(size_t)uDataSize
{
//stmts;
}
@end
@interface RS232MsgRequestSession : RS232Msg{
}
+(RS232Msg*)NewMsg;
@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() 方法
答案 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