当前位置:  开发笔记 > IOS > 正文

我为什么要写[anView release],anView = nil; 而不是[anView发布];?

如何解决《我为什么要写[anViewrelease],anView=nil;而不是[anView发布];?》经验,为你挑选了2个好方法。

在某个地方,我正在阅读 - 关于低记忆警告和放弃一个不可见的视图及其所有的子视图(=我觉得整个笔尖),你应该这样做:

-(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中).一旦用户想再次看到该视图,您将再次快速加载笔尖然后:它加载所有视图,连接插座,然后砰!你的另一个保留视图现在已经挂起,没有任何指针在内存块中的某个地方孤独,导致内存泄漏,直到你的应用程序崩溃.

正确错误?



1> mouviciel..:

这个原则比UIView更普遍.实际上它比Objective-C/Cocoa -release方法更通用.它也适用于C malloc()/ free()内存功能.

当您不再需要对象或任何内存区域时,首先释放/释放它.然后,为了确保不再使用它,可以通过分配nil对象或NULL内存指针来清除访问此对象或内存区域的方法.


+1.重点是取消引用空指针会立即中止执行,而引用指向已释放内存的指针可能会"工作"一段时间并导致令人不快的错误.

2> Arjan..:

其他一些方法可能因某种原因而得到了观点

除非你dealloc自己调用,否则只有当保留计数变为零时才会调用它.

请注意,在Objective-C中,向nil"对象" 发送消息(通常)非常好.这样做不会使程序暂停,但是消息会被忽略.但是,您无法向释放的对象发送消息,这会导致崩溃.

因此,以下内容会给您一个错误:

[anView release];
[anView doSomething];

但是,这实际上是好的:

[anView release];
anView = nil;
[anView doSomething];

这是一个品味的问题,但对于上述情况,你可能实际上更喜欢崩溃你的程序,而不是想知道为什么没有执行某事...

另请参阅Apple的Objective-C 2.0编程语言简介中的发送消息为零.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有