Think of it this way... the declarations in your header file are a contract that states that the class and instances of the class will respond to particular messages. When you pass a message, the runtime will find the method associated with that message and invoke it. If you pass a message that does not match the prototypes in the header file, no method will be run. Normally you will get a compiler warning that the Object may not respond to that message. Due to inheritance there's a chance that you can ignore this if you know, for sure, the object will respond to the message you are passing. Otherwise, chances are the message pass will fail at runtime.
The return type of a method will never affect whether you can invoke it without assigning the result, so this won't stop you from making a call. The argument number and types do have an affect, so if you say something has no arguments but in your message you pass some, this doesn't match so the message fails. If you declare a method to take a single NSString * and you pass an int, the message pass will fail. You must pass things exactly as the method signature is defined.
Note that this is different than the behavior in C. There is no overloading in C. If there is a function called foo, foo will get called no matter how many arguments it takes or how many you pass. You may ruin the stack passing the wrong number of arguments, but nothing is going to stop you from doing so.
-Lee