读取NSUserDefaults时出现“EXEC_BAD_ACCESS”错误

时间:2011-10-13 19:23:19

标签: iphone settings nsuserdefaults exc-bad-access

当我读取NSUserDefaults时(通过InAppSettingsKit),我发生错误。我不确定这是否是我的代码问题。我已经设置了一个观察者来检查NSUserDefaults是否有任何更改:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
           selector:@selector(setOptions)  
               name:NSUserDefaultsDidChangeNotification
             object:nil];

此调用的方法用于更新MKMapView的“地图类型”:

- (void)setOptions
{
    // Get the map style
    NSString *mapStyle = [[NSUserDefaults standardUserDefaults] stringForKey:kMapType];

    // Update map style
    if ([mapStyle isEqualToString:@"Hybrid"]) 
    {
        map.mapType = MKMapTypeHybrid;
    }
    else if ([mapStyle isEqualToString:@"Map"]) 
    {
        map.mapType = MKMapTypeStandard;
    }
    else if ([mapStyle isEqualToString:@"Satellite"]) 
    {
        map.mapType = MKMapTypeSatellite;
    }

    [mapStyle release];
}

应用程序设置为按下按钮并初始化InAppSettingsKit,在此我更改要显示的地图类型的设置并返回到我的应用程序中的主屏幕。此时地图似乎正确更新,没有问题。当我尝试重新启动InAppSettingsKit以再次更改地图类型时,会出现此问题。

有没有人知道我的代码是否属于问题,如果有,我该如何解决?

1 个答案:

答案 0 :(得分:3)

只需删除代码行:[mapStyle release]

stringForKey:将返回自动释放的NSString。所以你的代码不负责发布。它在第一次迭代中工作正常,因为第一次释放调用将释放该字符串,但NSUserDefaults仍然有一个指向该String的指针但未使用。在第二次迭代中,您获得该指针并尝试在该dealloc-ed对象上调用isEqualToString将导致BAD_ACCESS