是我的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”.
答案 0 :(得分:4)
在将新视图控制器推送到导航堆栈时,您不能(也不应该)释放/取消激活父视图控制器。您可以通过回复didReceiveMemoryWarning
消息来卸载视图。
您的代码还有其他一些问题:
[obj dealloc]
。始终使用[obj release]
。 init
方法名称应更具描述性,以免与预定义的init
方法冲突。如果需要使用它,您还应该(可能)强烈键入ref
参数。像(id)initWithParent:(UIViewController*)ref
这样的东西会更好。MainListController
对象,因为您正在分配/初始化它,然后将其交给navigationController。将您的代码更改为[[[MainListController alloc] initWithParent:self] autorelease]
。答案 1 :(得分:3)
不,你不能释放不可见的UIViewControllers
。当顶部的控制器弹出导航控制器时会发生什么?操作系统会显示什么?
相反,您应该在所有控制器中实现didReceiveMemoryWarning
方法。这些应尽可能release
(不是dealloc
)缓存数据。您应该考虑从磁盘重新计算或重新启动的任何内容。
这比仅仅dealloc
不可见的视图更好,因为您实际上并不知道提前有多少内存可用。在iPhone 3GS上,即使使用40Mb,也可能会留下足够的内存。