yandexmobile/yandexmapkit-ios — Issue #7: вероятно некорректный NSAssert внутри библиотеки
Author: progn
Created: 2012-02-03 05:23:39+00:00
State: open

вероятно некорректный NSAssert внутри библиотеки

в проекте возникает:

NSInternalInconsistencyException: -[YMapViewController mapView:viewForAnnotation:] returned a view with an annotation different from given

////

есть пара точек EstYAnnotation : NSObject

которые сделаны свойствами в контролере с картой

@interface YMapViewController ()

@property (retain, nonatomic) EstYAnnotation *startAnnotation, *finishAnnotation;
....

в процессе работы они иногда добавляются иногда удаляются

[map_view addAnnotation:startAnnotation];

....
[map_view removeAnnotation:startAnnotation];

...
[map_view removeAnnotation:finishAnnotation];
...

и в ситуации когда когда две точки были добавлены, затем удалены и добавлена одна точка возникает исключение

NSInternalInconsistencyException: -[YMapViewController mapView:viewForAnnotation:] returned a view with an annotation different from given (view.annotation = , annotation = ).

тут EstYAnnotation: 0x89e3ad0 и EstYAnnotation: 0x89dcb10 адреса startAnnotation и finishAnnotation

в коде

- (YMKAnnotationView *)mapView:(YMKMapView *)mapView viewForAnnotation:(id)annotation
{
static NSString * identifier = @"pointAnnotation";
YMKPinAnnotationView * view = (YMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (view == nil) {
view = [[[YMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
}

/// настройка view не влияющая на возникновение NSInternalInconsistencyException

return view;
}

вроде ничего некорректного не происходит в этом коде? Стандартные Гуглокарты работают.

баг можно обойти, если не использовать dequeueReusable, а создавать

YMKPinAnnotationView *view = [[[YMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil] autorelease];

но будут еще сотни переменных точек, и такой подход будет вызывать повышенный расход памяти. В этом как бы и суть dequeueReusable что вьюха ранее показывала другой объект, а теперь новый

ps
спасибо за библиотеку и интерфейс максимально приближенный к стандартному MapKit, это удобно