Ошибка «EXEC_BAD_ACCESS» при чтении NSUserDefaults - PullRequest
0 голосов
/ 13 октября 2011

У меня возникает ошибка при чтении 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 Ответ

3 голосов
/ 13 октября 2011

просто удалите строку кода: [mapStyle release]

stringForKey: вернет автоматически освобожденный NSString. Таким образом, ваш код не несет ответственности за выпуск. Он отлично работает в первой итерации, потому что первый вызов release освобождает эту строку, но NSUserDefaults все еще имеет указатель на эту строку, но не используется. Во второй итерации вы получаете этот указатель и пытаетесь вызвать isEqualToString для этого освобожденного объекта, который вызовет BAD_ACCESS

...