我正在阅读的某个地方,当我因为内存不足警告而暂时放弃一个视图时会遇到内存问题(如果用户想要看到它就会再次加载它),如果ViewController类没有这样做的话在这个观点的每个出口都有这个:
-(void)dealloc {
[myView release], myView = nil;
[myLabel release], myLabel = nil;
[super dealloc];
}
我在这里感到困惑,因为实际上我认为[myView release]也会成为nil-thing,说变量不再存在任何对象。为什么两次?或者我错过了什么?
答案 0 :(得分:5)
调用[myView release]
不会更改myView
的值,它会减少myView
指向的对象的保留计数(以及对象的保留计数为零时) ,它dealloc
本身)。调用[myView release]
后,myView
仍然包含视图对象的地址,但如果myView
是唯一的所有者,则该对象已自行dealloc
并且内存不再存在有效(我现在被另一个对象或其他数据占用)。通过将myView
设置为nil
,您可以确保不会意外地使用过去属于myView
的旧内存,现在您可以测试myView
是否有已被初始化或丢弃。
请注意,您无需在myView
方法中将nil
设置为-dealloc
,因为无论如何您的视图控制器都会消失,但您可能希望这样做如果您丢弃视图以响应内存不足警告,请执行此操作。如果视图不可见,您也可以考虑丢弃整个视图控制器。
答案 1 :(得分:0)
当视图控制器收到内存警告,并且视图在屏幕外时,它可能会将view属性设置为nil。但是,这不会释放您可能在其他属性中保留的任何子视图。所以这就是你如何处理:
- (void)setView:(UIView *)view
{
[super setView:view];
if (view == nil)
{
// Release-and-nil any subviews that you might be retaining.
}
}