Iphone - 推送后控制器被释放了吗?

时间:2009-08-06 13:48:36

标签: iphone cocoa-touch xcode

当我调用另一个控制器时,

是我的UIViewController被释放了吗? 当我推送到另一个控制器时如何释放控制器的内存?由于LOW MEMORY(无泄漏),我需要超过40Mo和申请休假。

[self.navigationController pushViewController:[[MainListController alloc] init:self] animated:NO];

@interface MainListController : UIViewController
...
- (id)init: (id)ref;

当我调用init函数时,控制器的dealloc是:

[ref dealloc];

我有这个错误:

objc[70754]: FREED(id): message isEqual: sent to freed object=0xe216b0
Program received signal:  “EXC_BAD_INSTRUCTION”.
  • (void)dealloc {[super dealloc];}

2 个答案:

答案 0 :(得分:4)

在将新视图控制器推送到导航堆栈时,您不能(也不应该)释放/取消激活父视图控制器。您可以通过回复didReceiveMemoryWarning消息来卸载视图。

您的代码还有其他一些问题:

  1. 永远不要手动拨打[obj dealloc]。始终使用[obj release]
  2. 您的init方法名称应更具描述性,以免与预定义的init方法冲突。如果需要使用它,您还应该(可能)强烈键入ref参数。像(id)initWithParent:(UIViewController*)ref这样的东西会更好。
  3. 您的代码正在泄漏MainListController对象,因为您正在分配/初始化它,然后将其交给navigationController。将您的代码更改为[[[MainListController alloc] initWithParent:self] autorelease]

答案 1 :(得分:3)

不,你不能释放不可见的UIViewControllers。当顶部的控制器弹出导航控制器时会发生什么?操作系统会显示什么?

相反,您应该在所有控制器中实现didReceiveMemoryWarning方法。这些应尽可能release(不是dealloc缓存数据。您应该考虑从磁盘重新计算或重新启动的任何内容。

这比仅仅dealloc不可见的视图更好,因为您实际上并不知道提前有多少内存可用。在iPhone 3GS上,即使使用40Mb,也可能会留下足够的内存。