A message is the name of a selector, and the parameters for that selector.
A selector is a symbol.
A method is a piece of code in a class identified by a selector.
In other words,
[foo bar: baz] says "send the message called
@selector(bar:) with parameter
baz to object
foo. You could send that message to many different objects.
In contrast, the method
bar: for a
Foo might look like
return n + 1;
but for a
FooTwo might look like
return n + 2;
(I hope I have the syntax right; it's been a while since I last touched Objective-C.)
When you send the message, the Objective-C kernel dispatches the message to
foo which decides whether it understands the message. It decides this based on whether it can find a method identified by that selector.
Two methods with the same name, and one message.
It's also possible for an object to simply forward a particular message (or set of messages) to another object for processing. In this case, you send a message to this proxy object, which has no methods to match that message, and the proxy forwards the message to its wrapped object.