2011-02-28 58 views
0

即时通讯存在问题,当我的自定义UIViewController(MyVC)的dealloc方法在弹出时未被调用。阅读其他一些关于SO的答案,似乎一个罪魁祸首可能是我仍然在某处引用MyVC,这就是为什么dealloc没有被调用。未在UIViewController中调用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. 创建和当按下导航栏,popViewControllerAnimated后退按钮如上
  2. 描述从RootVC推MyVC :在navigationController中调用并且MyVC被弹出
  3. 如果没有对MyVC的进一步引用,那么navigationController会调用它的dealloc方法?

不确定3号?我还没有发现任何使用仪器的泄漏,似乎它不能在MyVC中使用,因为它的dealloc方法甚至没有被调用,所以它会如何清理它呢?

回答

0

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

除非您在对象的'class'dealloc方法中释放iVar(因此vC),否则即使对象弹出也不会被释放。因此,将[somIvar release]添加到对象dealloc方法中,并且所有应该都是好的...

顺便说一下,在将对象分配给iVar后,您可以安全地释放vC,因为它将由对象保留,直到它自己释放为止。

+0

Thx的回应,虽然我很困惑,因为“因为你使用点符号将你的VC分配给另一个对象的iVar”。我以为我是在我的newVC中分配ojbA给ivar而不是其他方式?我在newVC的dealloc方法中也有[someIvar release],但是如前所述,dealloc方法永远不会调用newVC,因此[someIvar release]也永远不会被调用? – James 2011-02-28 20:35:59

+0

@James:你说得对,Toastor似乎已经变得困惑。这是objA被保留在那里(至少如果该财产是宣布保留,而不是分配或复制)。我发现您发布的代码中没有任何内容会导致newVC有额外的保留。 – Anomie 2011-02-28 20:50:29

+0

你说得对。我混淆了事情,对不起!好吧,事情并不那么明显我害怕......我会再次考虑并删除我的答案,如果我不提出另一个想法...再次,我很抱歉! – Toastor 2011-02-28 21:00:41