Objective-C is a curious language that falls somewhere in the middle between Smalltalk and Object Pascal. Variables in Objective-C may or may not have declared types, thus it has both static and dynnamic typing depending upon the declarations.
Regardless of the type associated with a variable, all values maintain their own type information.
Like Smalltalk, in general the legality of message passing cannot be checked at compile time, and hence is determined at run-time. You can sometimes, therefore, get a run-time ``does not understand'' error message.