 <p>Selectors are ONE way to go... the alternative is to create a protocol and to require invokers of your API to provide a "delegate" object that implements the protocol. Then you can invoke the required selectors of that protocol on the delegate object that you have been given. Each has its advantages and disadvantages.</p> <p>Example using selectors: <a href="http://developer.apple.com/mac/library/documentation/cocoa/reference/foundation/Classes/NSThread_Class/Reference/Reference.html#//apple_ref/occ/clm/NSThread/detachNewThreadSelector:toTarget:withObject:" rel="nofollow noreferrer">NSThread:detachNewThreadSelector:toTarget:withObject</a></p> <p>Example using delegates:<a href="http://developer.apple.com/mac/library/documentation/cocoa/reference/foundation/Classes/NSXMLParser_Class/Reference/Reference.html#//apple_ref/occ/instm/NSXMLParser/setDelegate:" rel="nofollow noreferrer">NSXMLParser:setDelegate</a> + <a href="http://developer.apple.com/mac/library/documentation/cocoa/reference/foundation/Classes/NSXMLParser_Class/Reference/Reference.html#//apple_ref/occ/instm/NSXMLParser/parse" rel="nofollow noreferrer">NSXMLParser:parse</a> </p>