在我的应用中,我有UINavigationController
。
在某些页面中,我获得了MKMapView
作为后视图(允许更改地图查看覆盖UIView
UI,因此我无法将其设为图像)。
在某些组合中,可能有3个左右MKMapView
已分配。
问题是每个MKMapView
几乎 60MB ,因此内存只会从地图跳到 180+ MB 。更不用说用户是否打开了更多带有地图的ViewControllers,他将获得OutOfMemoryException
。
所有地图都有相同的内容,我尝试将地图从ViewController
移动到另一个地图,但根据StackOverflow中的另一篇文章,将UIView
从ViewController
移到另一个地方是针对MVC ,更不用说它将它从调用者ViewController
中删除。
基本上,由于所有地图都包含相同的内容,而我希望它们包含所有注释,因此最好只移动地图,但我很难用它。
我有一个开箱即用的解决方案,即从其superView中删除MKMapView
并在viewWillAppear
重新分配它,但这似乎不是最好的主意。
答案 0 :(得分: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中使用相同的代码(目标控件是哪个控制器除外)。映射只需要在第一个控制器的viewDidLoad方法中实例化一次。更简单的实现是让所有后续视图控制器从第一个控制器继承。如果你这样做,你将不需要在viewWillAppear或viewWillDisappear中放置任何东西。您只需要覆盖prepareForSegue。