不确定我如何获得EXC_BAD_ACCESS KERN_INVALID_ADDRESS

时间:2017-01-16 20:40:19

标签: ios objective-c mmdrawercontroller

我已经查看了很多关于此错误的其他StackOverflow帖子,所有这些都提供了非常合理的解决方案。换句话说,他们通常会在代码中找到一些不会被自动保留的东西,但应该是,然后它会导致崩溃。

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

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

我的MainMenuDrawerViewControllerUITableViewController,位于左侧抽屉中(使用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;
}

0 个答案:

没有答案