从plist加载时基于MapKit的应用程序崩溃

时间:2011-04-08 20:25:41

标签: arrays xcode ios mapkit plist

我正在编写一个程序,它使用MapKit显示一个地图,该地图将从plist文件加载自定义注释。每个注释都是根数组中的字典项,具有标题,副标题,纬度和经度。当我在注释中硬编码以用于测试目的时,该程序工作得非常好。但是随着MapDemoAnnotation类的添加以及我在属性列表中读取的尝试,程序在启动时崩溃。

这是我的注释实现:

#import "MapDemoAnnotation.h"

@implementation MapDemoAnnotation

@synthesize coordinate;
@synthesize title;
@synthesize subtitle;

-(id)initWithDictionary:(NSDictionary *)dict{
    self = [super init];
    if(self!=nil){
        coordinate.latitude = [[dict objectForKey:@"latitude"] doubleValue];
        coordinate.longitude = [[dict objectForKey:@"longitude"] doubleValue];
        self.title = [dict objectForKey:@"name"];
        self.subtitle = [dict objectForKey:@"desc"];
    }
    return self;
}

-(void)dealloc{
    [title release];
    [subtitle release];
    [super dealloc];
}
@end 

我猜测我的RootViewController类中的viewDidLoad方法是个问题。

- (void)viewDidLoad {
    [super viewDidLoad];
    MKMapView *mapView = (MKMapView*)self.view;
    mapView.delegate = self;
    mapView.mapType=MKMapTypeHybrid;
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = 39.980283;
    coordinate.longitude = -75.157568;
    mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 2000, 2000);

    //All the previous code worked fine, until I added the following...
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Locations" ofType:@"plist"];
    NSData* data = [NSData dataWithContentsOfFile:plistPath];
    NSMutableArray* array = [NSPropertyListSerialization propertyListFromData:data
                                                             mutabilityOption:NSPropertyListImmutable
                                                                       format:NSPropertyListXMLFormat_v1_0
                                                             errorDescription:nil];
    if (array) {
        NSMutableDictionary* myDict = [NSMutableDictionary dictionaryWithCapacity:[array count]];
        for (NSDictionary* dict in array) {
            MapDemoAnnotation* annotation = [[MapDemoAnnotation alloc]initWithDictionary:dict];
            [mapView addAnnotation:annotation];
            [annotation release];
             }
             NSLog(@"The count: %i", [myDict count]);
    }

    else {
        NSLog(@"Plist does not exist");
    }}

由于我无法想象的原因程序崩溃,但我认为我在读取属性列表或MapDemoAnnotation类中时一定做错了。我错过了一些明显的东西,还是犯了新手的错误? 我的代码主要是借用的,所以我可能会偏离基础,我正在接近它。

提前致谢!

1 个答案:

答案 0 :(得分:1)

调用propertyListFromData的第三个参数是错误的。编译器必须在那里给你一个“从没有强制转换的整数生成指针”警告,因为format参数需要一个指向NSPropertyListFormat变量的指针(因此该方法可以格式返回给你)。所以你需要这样做:

NSPropertyListFormat propertyListFormat;
NSMutableArray* array = [NSPropertyListSerialization 
    propertyListFromData:data 
    mutabilityOption:NSPropertyListImmutable 
    format:&propertyListFormat 
    errorDescription:nil];

但是,文档提到上述方法已过时,您应该使用propertyListWithData:options:format:error:


但是,更容易调用NSArray的initWithContentsOfFile:方法:

NSString *plistPath = [[NSBundle mainBundle] pathForResource...

NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath];

if (array) {
    //your existing code here...
}
else {
    NSLog(@"Plist does not exist");
}

[array release];