В viewForAnnotation
, эта строка:
statoAnn = [NSMutableString stringWithFormat:@"true"];
устанавливает statoAnn
в автоматически освобожденную строку.
Когда метод завершается, вызывается release
на statoAnn
, и он больше не владеет памятью, на которую он указывал. Когда метод вызывается снова при масштабировании или перемещении карты, память, на которую указывал statoAnn
, теперь используется чем-то другим (GMMGeoTileImageData
в данном случае). Этот объект не является NSString
и не имеет метода isEqualToString:
, и вы получаете сообщение об ошибке.
Чтобы исправить это, установите statoAnn
, чтобы значение сохранялось, как вы делаете в viewDidLoad
. Например, вы можете изменить его на:
statoAnn = [[NSMutableString alloc] initWithFormat:@"true"];
Вы также можете объявить statoAnn
как свойство (@property (nonatomic, copy) NSString *statoAnn
) и просто установить его, используя self.statoAnn = @"true";
. Установщик недвижимости сделает сохранение за вас.
Однако вам не нужно использовать строку для хранения значений «истина» и «ложь». Гораздо проще и эффективнее использовать простой BOOL
, и вам не придется беспокоиться о сохранении / освобождении, поскольку это примитивный тип, а не объект.
Другое дело, что viewForAnnotation
не является подходящим местом для установки region
вида карты в первую очередь. Вы можете сделать это в viewDidLoad
после добавления аннотаций.
Еще одна вещь: в верхней части viewForAnnotation
у вас есть комментарий «вернуть ноль для текущего местоположения пользователя», но этот код этого не делает. Он просто инициализирует вид на nil
. Чтобы действительно сделать то, что говорится в комментарии, вам нужно это:
MKPinAnnotationView *view = nil;
// return nil for the current user location...
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
Наконец, если dequeueReusableAnnotationViewWithIdentifier
действительно возвращает представление (если view! = Nil), вам нужно установить view.annotation
для текущей аннотации, так как повторно использованный вид мог быть для другой аннотации.