When you assign a delegate, remember to retain it manually based on the lifetime of the source. Otherwise you will get a “EXC_BAD_ACCESS code=1” (invalid pointer) when the source attempts to fire the event to the delegate (e.g. when setting UITabBarController.delegate).