2014-08-28 33 views
0

我是新来的Objective-C,所以请原谅我的无知:删除MKAnnotations

我已经宣布了一种方法,一类WGMap : MKMapView像这样:

- (void)cleanupMap { NSLog(@"Cleaning up the map!"); NSSet* visible = [self annotationsInMapRect:[self visibleMapRect]]; NSArray* all = [self annotations]; NSMutableArray* discard = [NSMutableArray array]; for (id<MKAnnotation> cur in all) { if (![visible containsObject:cur]) [discard addObject:cur]; } [self removeAnnotations:discard]; } 目的是清理当前不在屏幕上的MKAnnotations以节省内存。我使用GCD调度计时器定期调用此方法。

我有另一种并行运行的方法,偶尔会将MKAnnotations添加到MKMapView。我注意到我偶尔会得到以下错误: **** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x17025ed20> was mutated while being enumerated.'

有时,我会得到一个类似的数组超出范围的错误。

我该如何着手预防呢?我试过让我的班级(从MKMapView派生)NSArray* annotations属性atomic而不是默认的nonatomic,但它没有解决问题。

+0

如果viewForAnnotation方法已实现并正确使用视图出队/重用机制,则不需要自己执行此操作。你怎么知道你有“高内存使用率”问题? – Anna 2014-08-28 10:49:58

回答

0

你会得到例外,因为你在迭代中迭代self.annotations并从中删除它。

+0

虽然我不会在该迭代中删除它;请注意,我选择要删除的MKAnnotations并将它们添加到单独的NSMutableArray;在迭代之后,我实际上并没有删除注释。问题是,在我的应用程序的其他地方,注释正被添加到地图中。我正在寻找一种方法来使此线程安全,以防止此问题。 – gautam 2014-08-28 22:23:26