I heard that Objective-C is influenced by the \"message passing mechanism\" of SmallTalk.
Objective-C, like Smalltalk, can use dynamic typing: an object
One job of a compiler is to catch as many errors at compile time as possible. If it can tell that the call will fail at runtime, you generally want it to complain.
You can suppress this via casting to show that runtime resolution is happening:
[(id)brad sayHelloTest];