Objective-C is a dynamic language. It's perfectly fine(at compilation time) to send a message to a class that doesn't implement the appropriate method. You can also add methods to classes at runtime! Objective-C will let you get away with a lot of stuff. However, you generally should avoid such practices, unless you have a very good reason for doing so.
As you've found, you're "allowed" to skip declaring methods in your .h file, but it's not recommended. Why? First, if someone else is reading your code, it can be easier to get a quick list of all of the methods implemented. Second, if you're debugging your code, and getting a crash in, say objc_msgsend, where an object is being sent a message it won't respond to, you can easily track down the issue because it will occur as a warning in your code. If you always avoid naming functions in your .h file, you'll have hundreds(thousands?) of warnings, and it won't be easy to sift through them all.
In short, you can get away with a lot, but you should generally follow "good" coding practices.