2013-12-23 35 views
2

在我的应用程序中,我有UINavigationController与MKMapView的多个ViewControllers

在一些页面中,我获得了一个MKMapView作为后视图(允许更改地图查看覆盖图UIView UI,因此我无法将其作为图像)。 在某些组合中,可以有大约3个MKMapView分配。

的问题是,每个MKMapView需要近60MB ,所以内存跳起来180+ MB只能从地图。更不用说如果用户用map打开更多的ViewController,他会得到一个OutOfMemoryException

所有地图具有相同的内容,我试着移动从ViewController到另一个地图,但根据StackOverflow的另一篇文章,从ViewController移动UIView另一个是对MVC,更何况它从主叫ViewController中删除。

基本上,因为所有的地图都包含相同的内容,并且我希望它们包含所有注释,所以最好只移动地图,但我很难与此相关。

我已经有一个解决方案,它是从它的superView中删除MKMapView,并在viewWillAppear realloc它,但这似乎并不是最好的主意。

+0

我想你试图加载一个新的地图视图,通过检索用户的位置和每个视图控制器的坐标...尝试在应用程序委托方法中使用通知,并向所有对象广播消息当位置更新这种方式可以减少内存以及代码......你只需要从需要地图数据的视图控制器中设置一个监听器对象,并且不要忘记在viewdiddisappear中删除监听器......如果你还没有试过这种方法,让我知道我你会发布一个示例代码...快乐编码! – nravichan

+0

嗨,更少的代码是好的,谢谢你的建议,但仍然。由于内存中的地图太多,我可以愉快地到达OutOfMemory。 – user2558461

+0

@NiranjanRavichandran不保存任何明显的内存量。 OP正在尝试的工作是什么.. –

回答

2

当您从控制器移动到控制器时,我看不到将指针传递给单个地图视图的任何问题。除非您一次查看多个地图,否则我不明白为什么应该有更多的一个实例。除去在viewWillDisappear的视图,并且在prepareForSegue一个指针传递到地图:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    if (! self.mapView) { 
     self.mapView = [[MKMapView alloc] initWithFrame:self.view.frame]; 
    } 
} 


-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.view addSubview:self.mapView]; 
    [self.view sendSubviewToBack:self.mapView]; 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self.mapView removeFromSuperview]; 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    SecondViewController *secVC = segue.destinationViewController; 
    secVC.mapView = self.mapView; 
} 

随后控制器可能在viewWillAppear中,viewWillDisappear和prepareForSegue相同的代码(除什么控制器是destinationViewController)。该映射只需要在第一个控制器的viewDidLoad方法中实例化一次。更简单的实现方式是让所有后续视图控制器从第一个控制器继承。如果你这样做,你将不需要放置任何东西在viewWillAppear或viewWillDisappear。你只需要重写prepareForSegue。

+0

我做了这样的事情,它可以与具有100%相同内容的**地图一起使用。**如果内容不同,您会得到很多问题! (我意识到OP提到所有地图的内容都是平等的,只是一个小心的话:) –

+0

@ Daij-Djan,是的,当然,好点。如果你想要区别,这个方法将不起作用,因为你只是传递一个指向一个对象的指针。 – rdelmar