在我的一个应用程序中,我展示了一个登陆 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-推荐答案 strong>
它泄漏是因为着陆 Controller 仍在展示堆栈中,所以它没有被释放——导航 Controller 仍然持有一个引用。
这 - 巧合 - 回答了您的两个问题,因为 View Controller 不应该在演示堆栈中出现两次。
你可以检查它是否存在,在这种情况下只是
[self.navigationController popToRootViewControllerAnimated:NO];
而不是创建另一个实例。
关于ios - 重新登录 iOS 应用程序时出现内存泄漏,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/35081168/
|