Не знаете, как я получаю 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;
}