Не знаете, как я получаю EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Я просмотрел тонну других сообщений Stackru об этой ошибке, и все они дают очень разумные решения проблемы. Другими словами, они обычно определяют что-то в коде, что не сохраняется автоматически, но должно произойти, и это впоследствии вызывает сбой.

У меня проблема в том, что строка кода, которую Crashlytics говорит мне, похоже, не имеет ничего, что могло бы быть освобождено... по крайней мере, о чем я знаю. Надеюсь, вы сможете увидеть то, чего я не вижу.

Я сам не могу воспроизвести сбой, но Crashlytics говорит мне, что за последние 3 месяца у меня было 146 таких сбоев на 28 различных пользователей.

мой MainMenuDrawerViewController это UITableViewController который сидит в моем левом ящике (используя MMDrawerController).

Авария происходит в -tableView:didSelectRowAtIndexPath: на следующей строке:

[self updateCenterWithViewControllerIdentifiedBy:@"ReportsViewController"];

Только два объекта в этой строке self и строковый литерал, так что я не понимаю, что может быть в результате dealloc и что вызывает EXC_BAD_ACCESS.

Вот общий метод (с вырезанным нерелевантным кодом):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    switch (indexPath.row) {

        // removed other case statements

        case DrawerRowReports: {
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
                [self performSegueWithIdentifier:@"ShowReportList" sender:self];
            } else {
                [self updateCenterWithViewControllerIdentifiedBy:@"ReportsViewController"];
            }

            break;
        }

        // removed other case statements

        default:
            break;
    }

}

-updateCenterWithViewControllerIdentifiedBy: Функция создает экземпляр View Controller из раскадровки с использованием заданного идентификатора, а затем создает экземпляр MMNavigationController с первым контроллером представления в качестве корня, затем обновляет mm_drawerController поставить это MMNavigationController в центральное положение.

Я также включу этот метод ниже, НО в отчете Crashlytics не говорится, что плохой доступ происходит внутри метода, он говорит, что это происходит в строке выше.

- (nullable id) updateCenterWithViewControllerIdentifiedBy:(nullable NSString*)storyboardIdentifier {

    return [self updateCenterWithViewControllerIdentifiedBy:storyboardIdentifier withCloseAnimation:YES];
}

- (nullable id) updateCenterWithViewControllerIdentifiedBy:(nullable NSString*)storyboardIdentifier withCloseAnimation:(BOOL)withCloseAnimation {

    return [self updatePosition:DrawerCenter withViewControllerIdentifiedBy:storyboardIdentifier withValueDictionary:nil withCloseAnimation:withCloseAnimation];
}

- (nullable id) updatePosition:(DrawerPosition)position withViewControllerIdentifiedBy:(nullable NSString*)storyboardIdentifier withValueDictionary:(nullable NSDictionary*)configDictionary withCloseAnimation:(BOOL)withCloseAnimation {

    //BaseViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:storyboardIdentifier];
    UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:storyboardIdentifier];
    if (configDictionary != nil) {
        for (NSString *fieldname in [configDictionary allKeys]) {
            [viewController setValue:[configDictionary objectForKey:fieldname] forKey:fieldname];
        }
    }

    UINavigationController * nav = [[MMNavigationController alloc] initWithRootViewController:viewController];

    if (position == DrawerCenter) {

        [self.mm_drawerController setCenterViewController:nav
                                       withCloseAnimation:withCloseAnimation
                                               completion:nil];

    } else if (position == DrawerRight) {

        [self.mm_drawerController setRightDrawerViewController:nav];

    } else if (position == DrawerLeft) {

        [self.mm_drawerController setLeftDrawerViewController:nav];
    } else {
        NSLog(@"unknown drawer position: %ld", (long)position);
    }

    return viewController;
}

0 ответов

Другие вопросы по тегам