EXC_BAD_ACCESS 给MKMapView添加注解时出现错误

EXC_BAD_ACCESS error occurs when add annotation to MKMapView

我想使用纬度和经度显示注释,纬度和经度来自 JSON(nearbyStop),我将经度和纬度存储到两个 NSArray 中。当我尝试在 for 循环中向 mapview 添加注释时,出现 EXC_BAD_ACCESS 错误 有帮助吗?

    NSMutableArray *coordinateLongi = [[NSMutableArray alloc]init];
for (NSDictionary *stop in nearbyStop) {
    NSString *longi = stop[@"result"][@"lon"];
    if(longi == nil)
    {
        NSLog(@"there is no data");
    }
    else
    {
        [coordinateLongi addObject:longi];
    }
}

NSMutableArray *coordinateLatit = [[NSMutableArray alloc]init];
for (NSDictionary *stop in nearbyStop) {
    NSString *latit = stop[@"result"][@"lat"];
    if(latit == nil)
    {
        NSLog(@"there is no data");
    }
    else
    {
        [coordinateLatit addObject:latit];
    }
}

for(int i = 0; i<coordinateLongi.count;i++)
{
    CLLocationCoordinate2D coord;
    coord.latitude = [[NSString stringWithFormat:@"%@",[coordinateLongi objectAtIndex:i]] floatValue];
    for(int j = 0; j<coordinateLatit.count;j++)
    {
        coord.longitude = [[NSString stringWithFormat:@"%@",[coordinateLatit objectAtIndex:i]] floatValue];
    }


    CustomAnnotation *annotObj = [[CustomAnnotation alloc] initWithCoordinate:coord title:@"title" ];
    [map addAnnotation:annotObj];//Error occurs here.
}

这是我的 customAnnotation.h

 #import <MapKit/MapKit.h>

@interface CustomAnnotation : MKPlacemark
{
    CLLocationCoordinate2D coordinateL;
    NSString *title;
    NSString *subtitle;
    NSString *time;
}

@property (nonatomic)CLLocationCoordinate2D coordinateL;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *subtitle;
@property (strong, nonatomic) NSString *phone;
@property (strong, nonatomic) NSString *time;

-(id)initWithCoordinate:(CLLocationCoordinate2D) c  title:(NSString *) t  subTitle:(NSString *)timed time:(NSString *)tim;

-(id)initWithCoordinate:(CLLocationCoordinate2D) c title:(NSString *)tit;



@end

和customAnnotation.m

    #import "CustomAnnotation.h"

@implementation CustomAnnotation

@synthesize title;
@synthesize subtitle;
@synthesize phone;
@synthesize time;
@synthesize coordinateL;


-(id)initWithCoordinate:(CLLocationCoordinate2D) c  title:(NSString *) t  subTitle:(NSString *)timed time:(NSString *)tim
{
    self.coordinateL=c;
    self.time=tim;
    self.subtitle=timed;
    self.title=t;
    return self;
}

-(id)initWithCoordinate:(CLLocationCoordinate2D) c title:(NSString *)tit
{
    self.coordinateL=c;
    self.title=tit;
    return self;
}

@end

我怀疑这些行是问题所在:

NSString *longi = stop[@"result"][@"lon"];

NSString *longi = stop[@"result"][@"lat"];

因为变量stop为nil,或者字典stop[@"result"]为nil。尝试从 nil 字典中获取值会使您的应用程序崩溃,但是为字典添加 nil 检查(在本例中为 stopstop[@"result"])应该可以防止它崩溃,但会还让您有机会对不正确的字典状态进行一些错误处理。

这可能不是原因,但这...

@interface CustomAnnotation : MKPlacemark
{
    CLLocationCoordinate2D coordinateL;
    NSString *title;
    NSString *subtitle;
    NSString *time;
}

@property (nonatomic)CLLocationCoordinate2D coordinateL;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *subtitle;
@property (strong, nonatomic) NSString *phone;
@property (strong, nonatomic) NSString *time;

etc..

可以减少到

@interface CustomAnnotation : MKPlacemark

@property (nonatomic)CLLocationCoordinate2D coordinateL;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *subtitle;
@property (strong, nonatomic) NSString *phone;
@property (strong, nonatomic) NSString *time;

etc...

因为不需要为属性声明 ivar。

还有这些

@synthesize phone;
@synthesize time;
@synthesize coordinateL;

可以删除,因为您不需要合成属性,除非它们来自 titlesubtitleMKAnnotation 中执行的协议,MKPlacemark 符合。

MKPlacemark 已经定义了 coordinate

时,为什么要声明 coordinateL 我有点困惑

另一个可能的问题是您没有在 init 方法中调用超类。

所以你可能在你的两个初始化方法中都需要这个...

-(id)initWithCoordinate:(CLLocationCoordinate2D)coord title:(NSString *)title
{
    self = [super initWithCoordinate:coord addressDictionary:nil];
    if(self) {
      self.coordinateL = coord;
      self.title = title;
    }
    return self;
}