In taking a look at your code, i noticed that you create a new instance of the MainViewController everytime the user changes the map. So if a user switches the map 5 times, you will have 6 MainViewControllers alive in memory, each containing its own hierarchy of view objects including a map view and its layers. This is not very efficient.
It is better if you reuse the single instance of MainViewController by popping the MapPickerViewController from the navigation stack. You should use the viewWillAppear method in MainViewController to reset the map and add new layers to reflect the map that the user picked. If many of the layers are common between the maps, you don't need to reset the map, you can individually remove & add layers.