My understanding is that protocols are like interfaces in other languages -- they declare expected methods -- while categories allow you to add new methods to existing types (perhaps even types you don't own.)
Why, then, does the iPhone SDK sometimes use categories for declaring delegate types? Normally I would expect all delegates to be typed id<MyDelegateProtocol> but there are many examples where this is not the case.
For example, see NSURLConnection. Its delegate is typed "id" and the 'contract' is declared as a category on NSObject (NSURLConnectionDelegate).
So: what's the motivation for using categories in these cases?