[RS232MsgRequestSession NewMsg]
не дает вам адрес метода. Выражение вычисляется и объект результата передается в качестве аргумента. Хотя существует способ прямого доступа к реализации метода (подробнее см. this ), может быть более простой способ добиться того, чего вы хотите.
Подход на основе селектора
Вместо того, что вы делаете сейчас, вы можете подумать о том, чтобы сделать что-то вроде этого,
- (id) initWithTarget:(id)aTarget action:(SEL)aSelector ... {
// save these two for later reference.
}
и позже
if ( [target respondsToSelector:theSelector] ) {
result = [target performSelector:theSelector];
}
Таким образом, вы можете достичь того, что вы хотите.
Блочный подход
По правде говоря, блоки оказываются лучшим дополнением к 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