我浏览了很多关于此错误的其他 StackOverflow 帖子,所有这些帖子都为问题提供了非常合理的解决方案。换句话说,他们通常会查明代码中没有自动保留但应该自动保留的内容,然后它随后会导致崩溃。
我遇到的问题是,Crashlytics 告诉我的代码行似乎没有任何可能被释放的东西。至少我知道。希望你能看到我没有看到的东西。
我自己无法复制崩溃,但 Crashlytics 告诉我,在过去 3 个月中,我在 28 个不同的用户中发生了 146 次此类崩溃。
MyMainMenuDrawerViewController
是UITableViewController
位于我左侧抽屉中的一个(使用MMDrawerController
)。
崩溃发生在-tableView:didSelectRowAtIndexPath:
以下行:
[self updateCenterWithViewControllerIdentifiedBy:@"ReportsViewController"];
该行中仅有的两个对象是self
字符串文字,所以我不明白什么可能被释放并导致 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:
函数使用给定的标识符从情节提要中实例化一个视图控制器,然后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;
}