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

Tha*_*nks 7 iphone cocoa-touch memory-management uikit

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

-(void)dealloc {
    [anView release], anView = nil;
    [someImageView release], someImageView = nil;

    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

而不是

-(void)dealloc {
    [anView release];
    [someImageView release];

    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

在我调用release之后,将这些指针接口为nil(="no object")的原因是什么?让我猜一下:其他一些方法可能因为某种原因而得到了视图(任何人可以在何时发生这种情况?),然后发生didReceiveMemoryWarning事件,并释放一个当前不可见的整个笔尖+视图(即在multiview-app中).一旦用户想再次看到该视图,您将再次快速加载笔尖然后:它加载所有视图,连接插座,然后砰!你的另一个保留视图现在已经挂起,没有任何指针在内存块中的某个地方孤独,导致内存泄漏,直到你的应用程序崩溃.

正确错误?

mou*_*iel 14

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

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

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

Arj*_*jan 11

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

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

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

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

[anView release];
[anView doSomething];
Run Code Online (Sandbox Code Playgroud)

但是,这实际上是好的:

[anView release];
anView = nil;
[anView doSomething];
Run Code Online (Sandbox Code Playgroud)

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

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


Kev*_*lar 1

如果您的访问器具有与其关联的属性 yoc 并执行以下更简洁的方法,而不是执行显式释放并设置为 nil:

- (void) dealloc
{
    self.retainedProperty1 = nil;
    self.retainedProperty2 = nil;
    self.copiedProperty = nil;
    self.assignedProperty = nil;
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以拥有更少重复的代码,因为合成代码将为您处理您的发布。

编辑:我应该指出你的属性不能是只读的,否则你会因为明显的原因而得到编译器错误:)

  • 不可以。这是 Apple“明确”禁止的,并且在某些情况下是导致崩溃的好方法。请参阅http://stackoverflow.com/questions/192721/why-shouldnt-i-use-obective-c-2-0-accessors-in-init-dealloc (5认同)