I always had the impression a protocol should help me implement certain methods so my object will responds to certain messages. If I forget a method or type it wrong the compiler will tell me.
But what is the use of setting a protocol for a class when all methods are optional? Like in the NSSpeechSynthesizerDelegate-protocol. The compiler doesn’t remind me to implement some methods and he doesn’t tell me if I wrote a method name the wrong way. And the program works fine even without the protocol.
If you implement a delegate protocol of your own, you will get compiler warnings if you try to call the methods without them being declared somewhere (x may not respond to selector…).
It also helps with documentation and code completion to define a protocol. If you want to know which delegate methods are supported, you can simply look at the corresponding header file (or a documentation page that is generated from it).
When you start typing a new method in your class, Xcode is also smart enough to suggest method signatures from protocols your class conforms to.