在UIViewController中没有调用dealloc方法的问题

时间:2011-02-28 20:00:46

标签: iphone uiviewcontroller

我有一个问题,当我的自定义UIViewController(MyVC)的dealloc方法被弹出时没有被调用。在SO上阅读其他几个答案,似乎有一个罪魁祸首可能是我仍然在某处提到MyVC,这就是为什么dealloc没有被调用。

Obj *objA = [[Obj alloc] initWithValue:value];

MyVC *newVC = [[MyVC alloc] init];
newVC.somIvar = objA;

[self.navigationController pushViewController:newVC animated:YES];

[newVC release];
[objA release];

我仍然感到困惑的是,这是否意味着推送MyVC的根视图控制器(RootVC)仍然具有对它的引用或者MyVC内部的某些内容未被释放,这似乎很奇怪,因为它的dealloc方法不被称为obv它仍然引用了它的所有对象?

据我所知,从推送到弹出MyVC的事件顺序是:

  1. 如上所述从RootVC创建并推送MyVC
  2. 当在navBar上按下后退按钮时,在navigationController中调用popViewControllerAnimated:并弹出MyVC
  3. 如果没有对MyVC的进一步引用,那么navigationController会调用它的dealloc方法吗?
  4. 不确定3号?我没有发现任何使用乐器的泄漏,似乎它不能成为MyVC内部的东西,因为它的dealloc方法甚至没有被调用,所以它怎么会清理呢?

1 个答案:

答案 0 :(得分:0)

由于您使用点符号将vC分配给另一个对象的iVar,因此该对象将保留它(假设您已在属性声明中声明了retain)。

除非你在object'c类'dealloc方法中释放iVar(以及vC),否则即使对象弹出也不会释放它。所以,将[somIvar release]添加到对象dealloc方法中,一切都应该很好......

顺便说一句,你可以安全地在将vC分配给iVar之后立即释放vC,因为它会被对象保留,直到它被释放为止。