我已经查看了很多关于此错误的其他StackOverflow帖子,所有这些都提供了非常合理的解决方案。换句话说,他们通常会在代码中找到一些不会被自动保留的东西,但应该是,然后它会导致崩溃。
我遇到的问题是,Crashlytics告诉我的代码行似乎没有任何可能是dealloc的东西......至少我知道。希望你能够看到我没有看到的东西。
我自己无法复制崩溃,但Crashlytics告诉我,在过去的3个月内,我在28个不同的用户中发生了146次崩溃。
我的MainMenuDrawerViewController
是UITableViewController
,位于左侧抽屉中(使用MMDrawerController
)。
崩溃发生在以下一行的-tableView:didSelectRowAtIndexPath:
中:
[self updateCenterWithViewControllerIdentifiedBy:@"ReportsViewController"];
该行上唯一的两个对象是self
和一个字符串文字,所以我不明白什么可能是dealloc&d,并导致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;
}