2

我浏览了很多关于此错误的其他 StackOverflow 帖子,所有这些帖子都为问题提供了非常合理的解决方案。换句话说,他们通常会查明代码中没有自动保留但应该自动保留的内容,然后它随后会导致崩溃。

我遇到的问题是,Crashlytics 告诉我的代码行似乎没有任何可能被释放的东西。至少我知道。希望你能看到我没有看到的东西。

我自己无法复制崩溃,但 Crashlytics 告诉我,在过去 3 个月中,我在 28 个不同的用户中发生了 146 次此类崩溃。

MyMainMenuDrawerViewControllerUITableViewController位于我左侧抽屉中的一个(使用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;
}
4

0 回答 0