Objective-C
is a runtime oriented language, which means that when it's possible
it defers decisions about what will actually be executed from compile
& link time to when it's actually executing on the runtime. This
gives you a lot of flexibility in that you can redirect messages to
appropriate objects as you need to or you can even intentionally swap
method implementations, etc. This requires the use of a runtime which
can introspect objects to see what they do & don't respond to and
dispatch methods appropriately