But what's the difference beteween @protocol MyButtonViewDelegate
and @protocol MyButtonViewDelegate <NSObject>.
The <NSObject> says that the protocol MyButtonViewDelegate conforms to the NSObject protocol. That is, any object that conforms to the MyButtonViewDelegate protocol must also conform to the NSObject protocol. (You may not have realized it, but there's a protocol named NSObject as well as a class by that same name.) So, if you've got an object that conforms to MyButtonViewDelegate, it's safe to call methods like -hash, -isEqual:, -retain, -release, -isKindOfClass:, etc.
Every object you're likely to encounter will already conform to NSObject because the class NSObject conforms to protocol NSObject. The only other Objective-C base class that you might run into is NSProxy, and that also conforms to NSObject. Therefore, adding <NSObject> to your protocol probably won't make a real difference, but it's a nice way to make the requirement explicit.