OGeek|极客世界-中国程序员成长平台

标题: ios - 重新登录 iOS 应用程序时出现内存泄漏 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 14:02
标题: ios - 重新登录 iOS 应用程序时出现内存泄漏

在我的一个应用程序中,我展示了一个登陆 View Controller ,如代码所示。这很好用,除了当我注销应用程序并重新登录时,调用相同的方法并最终创建一个新的 MyLandingController 保持旧的仍然挂起。因为,我将它分配给一个属性,它不应该自动取消分配旧的吗?我检查并确保没有其他对象保持对 MyLandingController 的强引用;虽然有弱引用。

- (void)presentMyLandingView {
    self.navigationController = nil;
    [[self.window viewWithTag:100] removeFromSuperview];
    self.window.backgroundColor = [UIColor whiteColor];
    self.primaryViewController = [[MyLandingController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.primaryViewController];
    [self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
    [self.window insertSubview:[self.navigationController view] atIndex:1];
    self.window.rootViewController = self.navigationController;
    [NSTimer scheduledTimerWithTimeInterval:.50 target:self selectorselector(clearSubviews) userInfo:nil repeats:NO];
}

作为一种临时解决方法,我想设置一个条件,如果我的旧 MyLandingController 存在,那么使用它而不是创建一个新的。这修复了泄漏,但整个 View 向上移动(看起来像导航栏大小向上移动)。

所以,我在这里寻找 2 个问题的答案 -

Q1) 为什么将新的 View Controller 对象重新初始化为不取消分配旧对象的属性。

Q2) 为什么重用现有对象(从弱引用中提取)不能很好地渲染 UI - 屏幕向上移动?



Best Answer-推荐答案


它泄漏是因为着陆 Controller 仍在展示堆栈中,所以它没有被释放——导航 Controller 仍然持有一个引用。

这 - 巧合 - 回答了您的两个问题,因为 View Controller 不应该在演示堆栈中出现两次。

你可以检查它是否存在,在这种情况下只是

[self.navigationController popToRootViewControllerAnimated:NO];

而不是创建另一个实例。

关于ios - 重新登录 iOS 应用程序时出现内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35081168/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4