我正在将当前控制器解除为我的根控制器。
[navigationController popToRootViewControllerAnimated:YES];
然而,导航控制器中的所有视图控制器都没有被释放(我可以看出,因为控制器类中的方法被调用两次并且没有调用dealloc方法)。我需要建议如何弄清楚为什么会发生这种情况。有没有一种特定的方法我需要解雇控制器或者可能还有其他事情发生。我正在使用ARC。
答案 0 :(得分:3)
这可能是由于很多原因造成的,但您很可能会抓住指向您viewController
弹出的viewController
的强大指针。发生的一种情况是,如果一个delegate
与另一个viewController
为delegate
,而Strong
属性为viewController
,则两个viewController
s保持一个强大的指针彼此。
确保没有任何其他对象持有指向您正在弹出的{{1}}的强指针。
答案 1 :(得分:3)
除了可以保存对委托的强引用之外,还应检查使用视图控制器的任何块,并且在块内部时始终使用弱引用。
来自Apple docs:
假设您要发出HTTP请求,并在视图控制器的视图中显示有关您从服务器获得的用户的一些信息。
- (void)requestUserInfo
{
[self.client makeGETRequest:@"http://example.org/user/1/" usingBlock:^(User *user, NSError *error) {
if (error) {
[self.errorView displayWithError:error];
}
else {
self.userView.user = user;
[self.userView setNeedsLayout];
}
}];
}
在这种情况下,当用户感到无聊,等待请求返回结果并点击"返回"按钮只关闭页面,视图控制器将不会被释放,直到请求完成加载和执行块。您可以通过覆盖dealloc
来自行查看。
因此,除非必要,否则始终对块内的__weak
使用self
个引用。
- (void)requestUserInfo
{
__weak UIViewController *weakSelf = self;
[self.client makeGETRequest:@"http://example.org/user/1/" usingBlock:^(User *user, NSError *error) {
if (error) {
[weakSelf.errorView displayWithError:error];
}
else {
weakSelf.userView.user = user;
[weakSelf.userView setNeedsLayout];
}
}];
}
答案 2 :(得分:0)
您正在弹出的控制器,它将从实际的viewController
中保留。就这样。你有两个解决方案:
当您按下viewController
时,请将其创建到位:
UIViewController *vc = [UIViewController initWith...];
[navigationController pushViewController:vc animated:YES];
另一个解决方案是weak
引用它:
//Property in the interface
@property (nonatomic, weak) UIViewController *vc;
//In the method
_vc = [UIViewController initWith...];
[navigationController pushViewController:vc animated:YES];
当viewController
被弹出,没有其他参考时,将被取消分配。
干杯!