title: Objective-C: Blocks vs. Selectors vs. Protocols
body: <p>I frequently find myself writing "utility" classes that can be re-used throughout my projects. </p>
  
  <p>For example, suppose I have an "Address Book" view. I might want to use my address book to select who gets sent an email, or maybe who gets added to a meeting request.  </p>
  
  <p>I'd develop this view controller so it can be used by both the email controller, and the meetings controller, with some sort of callback mechanism to let the caller know the user either finished selecting someone from the address book, or they canceled. </p>
  
  <p>It seems there are basically four (reasonable) approaches one might take in this scenario; </p>
  
  <ul>
  <li><p>Create an "AddressBookDelegate" protocol and a corresponding delegate property on the AddressBookController. Then use the messages defined in the protocol to communicate the result (similar to UIActionSheetDelegate).</p></li>
  <li><p>Create an "informal" "AddressBookDelegate" protocol and a corresponding delegate property on the AddressBookController, but the type of the delegate property will be "id", and will check at runtime with "respondsToSelector:" to see if the delegate implements the methods we require (seems like most of the framework stuff has started going this way).</p></li>
  <li><p>Pass the AddressBookController an id that represents a delegate, as well as two SELs which specify the methods to call when the user selects a user or cancels the request. The benefit I see with this is; suppose one controller supports BOTH sending emails AND setting up meetings (I know in this example that seems like bad design... but one can imagine a more generic situation where this would seem perfectly reasonable for a utility class) - In this case you could pass the AddressBookController different SELs depending on whether you're adding users to an email, or adding users to a meeting... a huge improvement over an iVar to indicate the controller's "state".</p></li>
  <li><p>Pass the AddressBookController two blocks; one to run when the user selects someone from the address book, and one to run if the user cancels the request. </p></li>
  </ul>
  
  <p>The blocks have been so tremendously useful to me, and SO much more elegant, I'm finding myself almost confused over when to NOT use them. </p>
  
  <p>I'm hoping more experienced members of the StackOverflow community than I can help out with their thoughts on this topic.</p>