EXC_BAD_ACCESS при запуске функции addToFavourites - PullRequest
0 голосов
/ 20 мая 2011

У меня есть функция addToFavourites, которая вызывает ошибку EXC_BAD_ACCESS.По сути, у меня есть контроллер представления «Избранное» со списком всех избранных, которые пользователь добавил ранее, теперь, при нажатии на одно из избранных, он перемещает представление в detailViewController, это прекрасно работает.На контроллере подробного представления у меня есть кнопка добавления в избранное, эта кнопка меняется на удаление из избранного, если обнаруживает, что ключ уже существует в словаре addToFavourites.Проблема возникает, когда пользователь обращается к этому detailViewController со страницы избранного, а также с главной страницы, на которой перечислены все подробные виды.Они могут сделать это, так как у меня есть панель вкладок.

Так, скажем, я в detailView, доступном через страницу избранного, кнопка избранного имеет «удалить из избранного», это правильно.Но затем, скажем, я нажимаю кнопку «Удалить из избранного», кнопка меняется на «Добавить в избранное» и удаляет ее из словаря.Пока все работает нормально.Теперь, когда я переключаюсь на тот же detailView, но на этот раз доступ к нему осуществляется с другой вкладки на панели вкладок, во-первых, кнопка «Избранное» по-прежнему показывает «удалить из избранного», а когда я нажимаю эту кнопку в первый раз, она меняется на «Добавить в«Избранное», затем, когда я нажимаю его снова, я получаю эту ошибку EXC_BAD_ACCESS.

Вот функция addToFavourites:

- (IBAction)addToFavourites:(id)sender {
    NSString *type = [[NSUserDefaults standardUserDefaults]objectForKey:@"type"];
    if(type == @"v") {
        NSString *area = [[NSUserDefaults standardUserDefaults]objectForKey:@"area"];
        NSString *ID1 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID1"];
        if([[addToFavouritesDictionary allKeys] containsObject:ID1]) {
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"];
            [addToFavouritesDictionary removeObjectForKey:ID1];
            [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal];
            [addToFavouritesDictionary writeToFile:filePath atomically: YES];
            NSLog(@"New Dictionary: %@", addToFavouritesDictionary);
        } else {
            NSString *ID1 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID1"];
            [addToFavouritesDictionary setObject:Name forKey:ID1];
            [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal];
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"];
            [addToFavouritesDictionary writeToFile:filePath atomically: YES];
            NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary);
            //[addToFavouritesDictionary release];
        }
} else {
        //NSString *area = [[NSUserDefaults standardUserDefaults]objectForKey:@"area"]; 
        NSString *ID2 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID2"];
        if([[addToFavouritesDictionary allKeys] containsObject:ID2]) {
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"];
            [addToFavouritesDictionary removeObjectForKey:ID2];
            [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal];
            [addToFavouritesDictionary writeToFile:filePath atomically: YES];
            NSLog(@"Dictionary: %@", addToFavouritesDictionary);
        } else {
            NSString *ID2 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID2"];
            [addToFavouritesDictionary setObject:Name forKey:ID2];
            [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal];
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"];
            [addToFavouritesDictionary writeToFile:filePath atomically: YES];
            NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary);
        }
    }
}

Спасибо за любую помощь!

Ответы [ 3 ]

0 голосов
/ 20 мая 2011

Ну ... или ваш объект addToFavouritesDictionary или ваш объект Name был освобожден.Как вы создаете эти объекты?Либо вы выпускаете их раньше, чем должны, или вы не сохранили их в первую очередь.

Управление памятью Objective-C

0 голосов
/ 20 мая 2011

Возможно, вам не следует использовать строку:

if(type == @"v") {

Здесь вы сравниваете указатель для переменной type с указателем для строки @"v".Вместо этого вы должны использовать метод, который сравнивает содержимое строки:

if ([type isEqualToString:@"v") {

РЕДАКТИРОВАТЬ

Самый простой способ сохранить ваши заголовки такими же, как хранитьтекст в NSUserDefaults.Вы можете сделать что-то вроде ниже, когда нажмете кнопку:

// For "Add to Favorites"
[[NSUserDefaults standardUserDefaults] setObject:@"+ Favorites" forKey:@"ButtonState"];

// For "Remove from Favorites"
[[NSUserDefaults standardUserDefaults] setObject:@"- Favorites" forKey:@"ButtonState"];

Затем вы выполните что-то подобное, когда загрузится представление:

[favoritesButton setTitle:(NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:@"ButtonState"] forState:UIControlStateNormal];
0 голосов
/ 20 мая 2011

Проверьте с помощью отладчика, точно ли он показывает строку сбоя ... и установите точку останова после этого, чтобы проверить значение

...