You should assign (= no change in retain count) delegates because you want to avoid "retain loops" (can't think of a better word)
Take a UITableView and a UIViewController.
When you add the UITableView to your viewController you retain it. Then you assign a delegate and a datasource (which is a delegate too) to your UITableView. Usually this is your viewController.
If the tableview would retain the datasource (your viewController) there would be a "retain loop"
viewontroller retains tableview.
tableview retains viewcontroller
The viewcontrollers dealloc (where you release the tableview) would never be called because tableview would never release your viewcontroller. And the other way around.
And because of this neither would get deallocated. That's why UITableView only assigns the datasource and the delegate. And you should do the same in your classes.