Я вызываю веб-службу, которая возвращает массив аннотаций в методе делегата, который я добавляю к своей карте с помощью метода addAnnotations
для MKMapView
. Все идет плавно, пока метод делегата не отправит сразу два массива (обычно около 150 мс - 500 мс), а затем я получаю EXC_BAD_ACCESS (code=1 address 0x20)
на этой линии [kMap addAnnotations:tileArray];
- Это, похоже, проблема с памятью, но я не совсем уверен, что делать, как это или как изменить свой код, чтобы решить эту проблему.EXC_BAD_ACCESS при добавлении данных в MKMapView
Вот метод делегата
-(void)rebelBaseManager:(RebelBaseManager *)manager didUpdateTileHour:(NSArray *)tileArray boundaryBreak:(NSString *)breakType atTileLevel:(int)callTileLevel {
if (timerStarted == NO) {
[self startTimer];
}
//Check for tileLevel in case multiple calls were made at different tile levels
if (tileLevel == callTileLevel) {
[kMap addAnnotations:tileArray];
[HourInMap addObjectsFromArray:tileArray];
}
}
Я также добавил метод, чтобы позволить мне анимировать удаление аннотаций, который находится ниже в случае, если это имеет значение:
- (void)removeAnnotationsWithFade:(NSArray *)annotations animated:(BOOL)shouldAnimate {
if (!shouldAnimate)
[self removeAnnotations:annotations];
else {
for (HourAnnotation *annotation in annotations) {
MKAnnotationView *annotationView = [self viewForAnnotation:annotation];
[UIView animateWithDuration:2
animations:^{
annotationView.alpha =0;
}completion:^(BOOL finished) {
[self removeAnnotation:annotation];
}];
}
}
--- ------ Сложение ---------
Добавление в мой код из пользовательского ап в ответ на № 3 в ответе Роба ниже.
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (id)initWithHourAnnotation:(HourAnnotation *)hourAnnotation reuseIdentifier:(NSString *)reuseIdentifier {
CGRect myFrame = self.frame;
myFrame.size.width = hourAnnotation.frameSize;
myFrame.size.height = hourAnnotation.frameSize;
self = [super initWithFrame:myFrame];
//When I use this here I seem to get the frame and color of the old annotation displayed
//self = [super initWithAnnotation:velocityAnnotation reuseIdentifier:reuseIdentifier];
if (self)
{
self.layer.cornerRadius = self.frame.size.width/2;
self.clipsToBounds = YES;
[self setBackgroundColor:[UIColor clearColor]];
NSArray *alphaValue = [[NSArray alloc]initWithArray:[self alphaForTileLevel]];
self.fillColor = [UIColor colorWithHue:hourAnnotation.color saturation:.06 brightness:.23 alpha:[[alphaValue objectAtIndex:hourAnnotation.tileLevel-1]doubleValue]];
self.strokeColor = [UIColor colorWithHue:hourAnnotation.color saturation:.06 brightness:.23 alpha:.35];
self.enabled = NO;
self.canShowCallout = NO;
self.userInteractionEnabled = NO;
}
return self;
}
- (void)drawRect:(CGRect)rect
{
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect];
[self.fillColor set];
[path fill];
[self.strokeColor set];
[path setLineWidth:2.0f];
[path stroke];
}
Возможно дубликат ниже, хотя и не совсем понятно: http://stackoverflow.com/questions/4202510/mkmapview-crashing-with-exc-bad-access – Rob
@Rob этот ответ на вопрос, который вы ссылки (http://stackoverflow.com/a/8932791/2939977) действительно помогли, так как я получил некоторые недопустимые координаты, но я также вижу несколько утечек памяти, которые вы рассмотрели в своем ответе ниже. Я просматриваю их сейчас –
Где находится 'kMap'? – jlehr