The statement is not entirely correct. The implementation being injected is actually `id _objc_msgForward(id receiver, SEL sel, ...)`, which is capable of taking anything. It may be better to word it that "the implementation is declared to have `void` return type and and objects parameters".

Adding an empty implementation is probably unnecessary. If the caller of the previously unimplemented selector knows a signature for the method, from a `@protocol` or `@interface`, then that signature overrides the `void`/`id*` signature declared by `-rac_signalForSelector:`. I don't even know what circumstances would require an empty implementation.