#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.