Ошибка SIGABRT при попытке создания нескольких аннотаций в MKMapView

#ios #annotations #mkmapview #sigabrt

#iOS #аннотации #mkmapview #sigabrt

Вопрос:

Я работал с MKMapView и размещаю значки аннотаций на карте. Я работаю над размещением 30 контактов на карте для 30 разных местоположений и обязательно запускал iPhone SDK после добавления каждого дополнительного местоположения. Затем, из ниоткуда, он начал сбой и выдал мне страшный «SIGABRT». AG!!

Я знаю, что это может быть небольшая ошибка в моем синтаксисе, но поскольку я только что копировал и вставлял код, который ранее работал, я в недоумении. Я рассматриваю возможность использования MKCoordinateRegionMake, чтобы сделать все более кратким (я читал, что это может быть вариантом), НО я уже ввел что-то вроде 10 хранилищ, поэтому для его переключения потребуется много времени, чего я не хочу делать, если это быстрое решение.

Я продолжил удаление всех координат, кроме одной, и это сработало. Затем я добавил еще одну обратно, и это сработало и т.д. По какой-то причине он работал много раз, но иногда он зависал и зависал. Я думал, что проблема заключалась только в определенных местоположениях, но, похоже, это никогда не было проблемой с синтаксисом какого-либо конкретного местоположения. Итак, теперь я не понимаю, что является ее причиной.

Я думаю, что это может быть проблемой выделения и освобождения, что я делаю неправильно? Я попытался «освободить» определенное выделенное пространство во время кода, но проблема не устранялась. Я также попытался сделать это, не освобождая выделенное пространство во время кода, та же проблема.

Вот код, с которым я работаю (весь код работал время от времени, поэтому я правильно настроил заголовок, субтитры и координаты в файле MillersLocations):

MapViewController.m

 - (void)viewDidLoad
{
    [super viewDidLoad];

    //Miller's Neighborhood Market #56
    MKCoordinateRegion store56;
    store56.center.latitude = 36.8605679;
    store56.center.longitude = -76.2866713;
    store56.span.latitudeDelta = 0.1;
    store56.span.longitudeDelta = 0.1;
    [mapView setRegion:store56 animated:YES];

    MillersLocations *ann56 = [[MillersLocations alloc]init];
    ann56.title = @"Store #56";
    ann56.subtitle = @"Come check us out!";
    ann56.coordinate = store56.center;
    [mapView addAnnotation:ann56];
    [MillersLocations release];
    //Not sure if release should be on this syntax


    //Miller's Neighborhood Market #66
    MKCoordinateRegion store66;
    store66.center.latitude = 37.0942970;
    store66.center.longitude = -76.4584890;
    store66.span.latitudeDelta = 0.1;
    store66.span.longitudeDelta = 0.1;
    [mapView setRegion:store66 animated:YES]; 

    MillersLocations *ann66 = [[MillersLocations alloc]init];
    ann66.title = @"Store #66";
    ann66.subtitle = @"Come check us out!";
    ann66.coordinate = store66.center;
    [mapView addAnnotation:ann66];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #21
    MKCoordinateRegion store21;
    store21.center.latitude = 37.0385289;
    store21.center.longitude = -76.4004810;
    store21.span.latitudeDelta = 0.1;
    store21.span.longitudeDelta = 0.1;
    [mapView setRegion:store21 animated:YES];    

    MillersLocations *ann21 = [[MillersLocations alloc]init];
    ann21.title = @"Store #21";
    ann21.subtitle = @"Come check us out!";
    ann21.coordinate = store21.center;
    [mapView addAnnotation:ann21];
    [MillersLocations release];
    //Not sure if release should be on this syntax


    //Miller's Neighborhood Market #67
    MKCoordinateRegion store67;
    store67.center.latitude = 37.6823690;
    store67.center.longitude = -77.5898330;
    store67.span.latitudeDelta = 0.1;
    store67.span.longitudeDelta = 0.1;
    [mapView setRegion:store67 animated:YES];

    MillersLocations *ann67 = [[MillersLocations alloc]init];
    ann67.title = @"Store 67";
    ann67.subtitle = @"Come check us out";
    ann67.coordinate = store67.center;
    [mapView addAnnotation:ann67];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #49
    MKCoordinateRegion store49;
    store49.center.latitude = 36.8550990;
    store49.center.longitude = -76.1355950;
    store49.span.latitudeDelta = 0.1;
    store49.span.latitudeDelta = 0.1;
    [mapView setRegion:store49 animated:YES];

    MillersLocations *ann49 = [[MillersLocations alloc]init];
    ann49.title = @"Store 49";
    ann49.subtitle = @"Come check us out";
    ann49.coordinate = store49.center;
    [mapView addAnnotation:ann49];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #82
    MKCoordinateRegion store82;
    store82.center.latitude = 36.7848840;
    store82.center.longitude = -76.1587459;
    store82.span.latitudeDelta = 0.1;
    store82.span.latitudeDelta = 0.1;
    [mapView setRegion:store82 animated:YES];

    MillersLocations *ann82 = [[MillersLocations alloc]init];
    ann82.title = @"Store 82";
    ann82.subtitle = @"Come check us out";
    ann82.coordinate = store82.center;
    [mapView addAnnotation:ann82];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #40
    MKCoordinateRegion store40;
    store40.center.latitude = 37.1236680;
    store40.center.longitude = -76.5093960;
    store40.span.latitudeDelta = 0.1;
    store40.span.latitudeDelta = 0.1;
    [mapView setRegion:store40 animated:YES];

    MillersLocations *ann40 = [[MillersLocations alloc]init];
    ann40.title = @"Store 40";
    ann40.subtitle = @"Come check us out";
    ann40.coordinate = store40.center;
    [mapView addAnnotation:ann40];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #55
    MKCoordinateRegion store55;
    store55.center.latitude = 36.7704630;
    store55.center.longitude = -76.6058140;
    store55.span.latitudeDelta = 0.1;
    store55.span.latitudeDelta = 0.1;
    [mapView setRegion:store55 animated:YES];

    MillersLocations *ann55 = [[MillersLocations alloc]init];
    ann55.title = @"Store 55";
    ann55.subtitle = @"Come check us out";
    ann55.coordinate = store55.center;
    [mapView addAnnotation:ann55];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #58
    MKCoordinateRegion store58;
    store58.center.latitude = 36.7818390;
    store58.center.longitude = -76.0479090;
    store58.span.latitudeDelta = 0.1;
    store58.span.latitudeDelta = 0.1;
    [mapView setRegion:store58 animated:YES];

    MillersLocations *ann58 = [[MillersLocations alloc]init];
    ann58.title = @"Store 58";
    ann58.subtitle = @"Come check us out";
    ann58.coordinate = store58.center;
    [mapView addAnnotation:ann58];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #57
    MKCoordinateRegion store57;
    store57.center.latitude = 36.8216160;
    store57.center.longitude = -76.4246680;
    store57.span.latitudeDelta = 0.1;
    store57.span.latitudeDelta = 0.1;
    [mapView setRegion:store57 animated:YES];

    MillersLocations *ann57 = [[MillersLocations alloc]init];
    ann57.title = @"Store 57";
    ann57.subtitle = @"Come check us out";
    ann57.coordinate = store57.center;
    [mapView addAnnotation:ann57];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #90
    MKCoordinateRegion store90;
    store90.center.latitude = 38.1330690;
    store90.center.longitude = -77.5124230;
    store90.span.latitudeDelta = 0.1;
    store90.span.latitudeDelta = 0.1;
    [mapView setRegion:store90 animated:YES];

    MillersLocations *ann90 = [[MillersLocations alloc]init];
    ann90.title = @"Store 90";
    ann90.subtitle = @"Come check us out";
    ann90.coordinate = store90.center;
    [mapView addAnnotation:ann90];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //56,66,21,67,49,90,82,40,55,58,57

}
  

Ошибка (поток 1: программа получила сигнал «SIGABRT».) всегда происходит в строке:

[MapView setRegion: store57 анимированный: ДА];

ИЛИ также в store90. Есть и другие хранилища, в которых это тоже происходило, но всегда в этой строке. Я не определил ни рифмы, ни причины.

Спасибо всем, кто может помочь! Прошу прощения, если я немного многословен, я просто хотел убедиться, что я включил любую информацию, которая вам понадобится, чтобы помочь.

Редактировать

Это сработало, как только я правильно синтезировал созданный мной выход MKMapView, а затем получил код для его выпуска («[MapView release];»). Я предполагаю, что просмотры карт освобождаются сами по себе, что могло бы стать причиной ошибки.

Это сработало нормально, а затем я пошел, чтобы добавить еще одну аннотацию, и она снова разбилась. Когда я удаляю новую аннотацию, она работает, поэтому возникает проблема, когда я добавляю больше. AG. Любая помощь приветствуется. Спасибо.

Ответ №1:

Наиболее вероятной причиной SIGABRT является то, что регион для store49 недействителен, что приводит к NSInvalidArgumentException и SIGABRT .

Для store49 (и всех последующих хранилищ) значение longitudeDelta не устанавливается.
Устанавливается только latitudeDelta (дважды).

Исправьте дублирующиеся latitudeDelta настройки на longitudeDelta .

Другая проблема заключается в следующем:

 [MillersLocations release];
  

Это попытка вызвать release MillersLocation класс, а не экземпляр того класса, который вы создаете. Все эти строки должны быть изменены на что-то вроде:

 [ann56 release];
  

Кроме того, вам не нужно каждый раз создавать регион для настройки аннотации. Например, вы можете просто сделать это:

 MillersLocations *ann56 = [[MillersLocations alloc]init];
ann56.title = @"Store #56";
ann56.subtitle = @"Come check us out!";
ann56.coordinate = CLLocationCoordinate2DMake(36.8605679, -76.2866713);
[mapView addAnnotation:ann56];
[ann56 release];
  

После добавления всех аннотаций вы можете создать область, которая охватывает все аннотации (если это то, что вы хотите) или просто показывает последнюю аннотацию, а затем вызвать setRegion один раз в конце.

Кроме того, вы можете захотеть сохранить хранилища в plist и перебирать plist для создания аннотаций вместо того, чтобы создавать их отдельно в коде.

Наконец, вы не должны удалять [mapView release]; (from dealloc ), даже если это IBOutlet.

Комментарии:

1. Вау, большое вам спасибо. Я не могу поверить, что я пропустил эту синтаксическую ошибку с проблемой latitudeDelta. Такая большая помощь, очень ценю это.

2. Кроме того (для всех, кто читает этот пост за помощью), вам необходимо добавить и импортировать CoreLocations Framework для использования CLLocationCoordinate2DMake.