Я пытаюсь узнать, как сбросить контакты на карте в iOS 6. У меня есть код, который компилируется и запускается, но который явно пропускает память - но когда я отпускаю (или autoRelease) объект mapData, с которым связано мое приложение. ОшибкаСбой после сброса контактов на карте в iOS6
Экземпляр 0x1b7ac0
класса AddressAnnotation
был освобожден, а наблюдатели с ключевыми значениями все еще были зарегистрированы с ним. Наблюдательная информация просочилась и может даже ошибочно привязана к другому объекту. Установите точку останова на NSKVODeallocateBreak
, чтобы остановиться здесь, в отладчике.
Существует более ранний пост только на этой ошибки, а также по отношению к MapKit:
Setting breakpoint at NSKVODeallocateBreak
Но это не помогает мне:
Во-первых, я не очень понимаю, ответ, но и его кажется, ответ не имеет отношения к моей проблеме, потому что я не имею не устанавливать наблюдателя каким-либо образом (что я знаю, что это!) Например, нигде в моем коде у меня есть строки
[addressAnnotation addObserver:self forKeyPath:kSelectedAnnotationObserverKeyPath options:NSKeyValueObservingOptionNew context:@"selectedOrDeselected"];
или что-нибудь иначе отдаленно похожие, которые были предложены b e проблема.
Сказав это, я также должен сказать, что я действительно не понимаю концепцию наблюдателя - я, конечно, создал пользовательский класс MapData
, который является NSObject <MKAnnotation>
, и я полагаю, что это также может быть источником проблема. Но я в основном ошеломлен.
Я попытался установить предложенную символическую точку останова, но мне это не полезно: я вижу, что у меня есть условие BAD ACCESS
, но это все, что я действительно понимаю!
Код я написал это:
- (void) showRecordsOnMap
{
NSMutableArray *projectMapAnnotationsArray;
projectMapAnnotationsArray = [[NSMutableArray alloc] init];
int i = 0;
for (i = 0; i < [currentProject.recordArray count]; i++)
{
Record *record = [[[Record alloc] init]autorelease];
record = [currentProject.recordArray objectAtIndex:i];
CLLocationCoordinate2D newCoordinate;
newCoordinate.latitude = record.latitude;
newCoordinate.longitude = record.longitude;
int tag = 0;
NSString *title;
title = [[[NSString alloc] init] autorelease];
title = [NSString stringWithFormat:@"Record %d",record.record_ID];
NSString *subtitle;
subtitle = [[[NSString alloc] init] autorelease];
subtitle = [NSString stringWithFormat:@"Record %d",record.record_ID];
MapData *mapData =[[MapData alloc] initWithCoordinate:newCoordinate withTag:tag withTitle:title withSubtitle:title];
[projectMapAnnotationsArray addObject:mapData];
//[mapData release];
}
[projectMap addAnnotations:projectMapAnnotationsArray];
[projectMapAnnotationsArray release];
}
, а затем следующий Нужный бит
- (MKAnnotationView *) mapView:(MKMapView *)mapView
viewForAnnotation:(MapData *)annotation
{
static NSString *record = @"record";
//the result of the call is being cast (MKPinAnnotationView *) to the correct
//view class or else the compiler complains
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[projectMap
dequeueReusableAnnotationViewWithIdentifier:record];
if(annotationView == nil)
{
annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:record] autorelease];
}
//if((annotation).tag == 2) annotationView.pinColor = MKPinAnnotationColorRed;
//else annotationView.pinColor = MKPinAnnotationColorGreen;
annotationView.pinColor = MKPinAnnotationColorGreen;
//pin drops when it first appears
annotationView.animatesDrop=TRUE;
//tapping the pin produces a gray box which shows title and subtitle
annotationView.canShowCallout = YES;
return annotationView;
}
Этот код работает, до тех пор, пока объект MapData не освобождается. Но ясно, что мне нужно его освободить. Как еще один ключ, если я раскомментировать
// if((annotation).tag == 2) annotationView.pinColor = MKPinAnnotationColorRed;
// else annotationView.pinColor = MKPinAnnotationColorGreen;
я получаю другую ошибку:
[MKUserLocation tag]: unrecognized selector sent to instance 0x9fcb010 2013-05-22 23:05:13.726 Geo360[1175:c07] *** Terminating app due to uncaught exception
'NSInvalidArgumentException'
, reason: '-[MKUserLocation tag]:
unrecognized selector sent to instance0x9fcb010
'
, но мне кажется, что эта вторая ошибка является более простой глупостью с моей стороны, что я по крайней мере знаю, как идти об обнаружении. Но ошибка «class AddressAnnotation
» полностью потеряла меня. Любая помощь очень ценится!
Edit:
Привет всем - Спасибо за то, что нашли время, чтобы помочь. Я все еще смущен. Прилагается код для объекта MapData, предложенный Анной Карениной. Verbumdei предположил, что я поместил массив в метод ViewDidLoad в качестве сильного свойства - я играл с этим, но я также хочу иметь возможность обновлять контакты карты массивом, который может иметь больше данных или меньше данных, поэтому мне показалось, что я чтобы каждый раз заново создавать массив. Возможно нет? АннаКаренина предположила, что в MapData может возникнуть проблема с выпуском, и теперь, когда я смотрю на нее, я немного подозрительно, что я не выпускаю тег, но, с другой стороны, это создает предупреждение!
Еще раз спасибо за помощь ... еще не решена.
MapData.h:
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface MapData : NSObject <MKAnnotation>
{
NSString *_title;
NSString *subtitle;
NSUInteger tag;
CLLocationCoordinate2D _coordinate;
}
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@property(nonatomic) NSUInteger tag;
// Getters and setters
- (id)initWithCoordinate:(CLLocationCoordinate2D)c withTag:(NSUInteger)t withTitle:(NSString *)tl withSubtitle:(NSString *)s;
@end
и MapData.m:
#import "MapData.h"
@implementation MapData
@synthesize coordinate;
@synthesize title;
@synthesize subtitle;
@synthesize tag;
-(id)initWithCoordinate:(CLLocationCoordinate2D)c withTag:(NSUInteger)t withTitle:(NSString *)tl withSubtitle: (NSString *)s
{
if(self = [super init])
{
coordinate = c;
tag = t;
title = tl;
subtitle = s;
}
return self;
}
- (void) dealloc
{
[title release];
[subtitle release];
[super dealloc];
}
@end
Почему вы выпускаете projectMapAnno tationsArray в конце метода showRecordsOnMap? –
Как [документация для addAnnotations] (http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/doc/uid/TP40008205-CH3- SW19) говорит, что «вид карты сохраняет отдельные объекты аннотации», поэтому вполне нормально (и вы должны) выпускать projectMapAnnotationsArray. Сбой может быть вызван некоторой проблемой управления памятью в методе init MapData, так что вызов release на mapData вызывает чрезмерный выпуск. Проводка кода метода инициализации MapData может помочь. – Anna
Сообщение об ошибке KVO может быть отдельной проблемой при сбое и из-за неверных координат (см. Http: // stackoverflow.ком/вопросы/5872547/предупреждение в-обычая-карта-аннотаций-iphone? LQ = 1). – Anna