Проблема здесь в том, что для связывания этих функций вы должны использовать ключевое слово selector, которое возвращает тип SEL. Это тип указателя, тогда как NSArray хранит объекты.
Таким образом, у вас есть три варианта;
- Использовать обычный массив типа C
- Сложите функции в производный класс NSObject, который будет их вызывать.
- Использовать протокол.
Второе, вероятно, лучше, и для этого вы можете использовать класс NSValue для хранения результатов селектора. Например,
NSValue* selCommandA = [NSValue valueWithPointer:@selector(handleCommandA:)];
NSValue* selCommandB = [NSValue valueWithPointer:@selector(handleCommandB:)];
NSArray *handler_table = [NSArray arrayWithObjects:selCommandA, selCommandB, nil ];
Если вы получили правильную запись из массива, для обратного преобразования вы должны сделать;
SEL mySelector = [selCommand pointerValue];
[someObject performSelector:mySelector];
(Заметьте, я предполагаю, что из вашего синтаксиса target-c предполагается, что они предназначены для использования в качестве методов объекта, а не глобальных функций. Если вы хотите использовать их глобально, вы должны написать их так, как если бы они были простыми C).
Другой вариант - формализовать командные методы в протокол. Это позволяет вам написать функциональность, которая будет работать с любым объектом, который реализует этот протокол, а компилятор обеспечит больше проверок, чем если бы вы просто вызывали селекторы.
* 1023 Е.Г. *
// some header
@protocol CommandHandler
@required
-(void) handleCommandA;
-(void) handleCommandB;
@end
// some other header
@interface someClass : NSObject<CommandHandler>
{
// you will receive compiler warnings if you do not implement the protocol functions
}
Ваш код обработки и отправки затем пишется для работы с объектами типа «CommandHandler». * 1026 например *
-(void) registerForCommands:(CommandHandler*)handler