Yes, the name of a delegate method must match the name it has been declared as in the delegate protocol. However, the names of the arguments do not need to match. Why is that? An instance of MKMapView, when an annotation is added to it, sends the message mapView:didAddAnnotationViews: to its delegate object. That looks just like you would expect:
[[self delegate] mapView:self didAddAnnotationViews:someViews];
The names of the arguments are no matter, it is only the message that is being dispatched. Remember that with delegation, there is no magic, there is just a message being sent.
I’d say the best way to really grasp this is to write your own class that uses a delegate.
Here is a “bonus challenge”: Make a copy of the Whereami project, so you can fiddle without losing any of your work.
Add a new method to the MapPoint class, something trivial, like - (void)becomeHipSpot.
Set it up so MapPoints have a delegate.
When you create an instance of MapPoint (in locationManager:didUpdateToLocation:fromLocation:), set its delegate to be the WhereamiAppDelegate and send the MapPoint the message becomeHipSpot.
Create a delegate protocol for MapPoint that has one method, - (void)mapPointDidBecomeHipSpot:(MapPoint *)mp;
Have this message be sent to a MapPoint’s delegate whenever a MapPoint is sent the message becomeHipSpot. (To make sure it works, put an NSLog in WhereamiAppDelegate’s implementation of mapPointDidBecomeHipSpot:).
Now, at this point, this will actually be a difficult challenge. When you finally solve it, you will most likely not believe you solved it because of how simple the solution is. But once you have solved it and believed you have solved it (which, of course, you can double-check by posting here), you will be at an entirely new level of understanding in the Objective-C world.