To expand on what's already been said: C-based language compilers require a certain amount of knowledge about the words in a .c/.cpp/.m file before they ever get around to linking in external libraries or object files. That information tells the compiler things like return types and the number and types of arguments of function and methods, and the instance variables and methods in classes.
If you were to actually include whole .c/.cpp/.m files inside the files that use their functionality, you would end up with a problem where the linker has duplicate code that it doesn't know what to do with; thus a header file just lists what they actually need to know about the interface, but not the implementation.
C and Objective-C actually allow you to omit various sorts of interface information, but they consequently make (often incorrect) assumptions if they see mentions of functions or methods whose headers they haven't read. For instance, an unknown function name will be correctly indentified as such, but the compiler will assume that it returns an int; my memory's a bit hazy on how arguments are handled, but it won't likely complain if you pass arguments that are incompatible with the ones in the implemented function that eventually gets linked in. Thus the compiler is unable to do a lot of the checks that static languages like C are good at.