Если проблема заключается в дополнительном времени компиляции и раздувании бинарного размера, полученном путем компиляции .h как части всех используемых им .cpp-модулей, во многих случаях то, что вы можете сделать, - это сделать класс шаблона опустившимся из не-шаблонного базовый класс для не зависящих от типа частей интерфейса, и что базовый класс может иметь свою реализацию в файле .cpp.
Когда вы используете протокол в качестве модификатора типа, вы можете предоставить список протоколов, разделенных запятыми. Итак, все, что вам нужно сделать, чтобы избавиться от предупреждения компилятора, - это добавить NSObject в список протоколов, например:
- (void)setupTimer:(id<TimerState,NSObject>) timerState {
// Create scheduled timers, etc...
}
Я предлагаю использовать Конечный автомат компилятора , он выведет код Objective-C . Я добился хороших успехов в Java и Python, используя это.
Вы не должны писать код конечного автомата вручную, вы должны использовать что-то для генерации кода за вас. SMC сгенерирует чистый и понятный код, который вы затем сможете просмотреть, если хотите извлечь из него уроки, или вы можете просто использовать его и покончить с этим.
Я довольно новичок в Objective-C, но я бы посоветовал вам посмотреть на прямую реализацию ANSI C для машины состояний.
То, что вы используете Cocoa, не означает, что вы должны использовать здесь сообщения Objective-C.
В ANSI C реализация машины состояний может быть очень простой и читабельной.
В моей последней реализации FSM на языке C для состояний указывались #define STATE_x
или перечислялись типы, и была таблица указателей на функции для выполнения каждого состояния.