在某个地方,我正在阅读 - 关于低记忆警告和放弃一个不可见的视图及其所有的子视图(=我觉得整个笔尖),你应该这样做:
-(void)dealloc { [anView release], anView = nil; [someImageView release], someImageView = nil; [super dealloc]; }
而不是
-(void)dealloc { [anView release]; [someImageView release]; [super dealloc]; }
在我调用release之后,将这些指针接口为nil(="no object")的原因是什么?让我猜一下:其他一些方法可能因为某种原因而得到了视图(任何人可以在何时发生这种情况?),然后发生didReceiveMemoryWarning事件,并释放一个当前不可见的整个笔尖+视图(即在multiview-app中).一旦用户想再次看到该视图,您将再次快速加载笔尖然后:它加载所有视图,连接插座,然后砰!你的另一个保留视图现在已经挂起,没有任何指针在内存块中的某个地方孤独,导致内存泄漏,直到你的应用程序崩溃.
正确错误?
这个原则比UIView更普遍.实际上它比Objective-C/Cocoa -release
方法更通用.它也适用于C malloc()
/ free()
内存功能.
当您不再需要对象或任何内存区域时,首先释放/释放它.然后,为了确保不再使用它,可以通过分配nil
对象或NULL
内存指针来清除访问此对象或内存区域的方法.
其他一些方法可能因某种原因而得到了观点
除非你dealloc
自己调用,否则只有当保留计数变为零时才会调用它.
请注意,在Objective-C中,向nil
"对象" 发送消息(通常)非常好.这样做不会使程序暂停,但是消息会被忽略.但是,您无法向释放的对象发送消息,这会导致崩溃.
因此,以下内容会给您一个错误:
[anView release]; [anView doSomething];
但是,这实际上是好的:
[anView release]; anView = nil; [anView doSomething];
这是一个品味的问题,但对于上述情况,你可能实际上更喜欢崩溃你的程序,而不是想知道为什么没有执行某事...
另请参阅Apple的Objective-C 2.0编程语言简介中的发送消息为零.