是否允许调用[self release]来控制对象的生命周期?

时间:2009-09-06 11:23:18

标签: iphone objective-c

我想在Objective C中创建一个对象,但我没有对它进行引用。

是否可以通过调用[self release]来让对象控制自己的生命周期?

如果您想知道我为什么需要这个:我想创建一个订阅某些通知的对象,但过了一段时间后,该对象不再需要并且应该消失。

那么,以下是允许的吗?

- (void) destroyMyself {
   [[NSNotificationCenter defaultCenter] removeObserver:self];

   [self release];
} 

6 个答案:

答案 0 :(得分:18)

如果你在代码中看到这个,那可能就错了。但是,在某些可以说是可辩护的情况下,它会有合理的回应。 (因此,请确保您出于正当理由这样做。)

当有意义时,一个很好的例子就是当你创建一个下载网址的对象时。下载URL时,该对象位于内存中,然后向其代理发送消息,说明数据已准备就绪(或无法下载URL)。一旦它的消息被发送,它就会破坏它自己,因为它不再需要它。在这种情况下,创建“url downloader”的代码/函数可能不再存在于内存中,即,如果响应用户选择调用菜单项或视图控制器中不再在屏幕上的操作而调用它

当创建“下载”对象的代码不关心下载是否完成时,这很有用。

答案 1 :(得分:9)

规则很简单。如果您拥有对象,则应该只释放它。即,使用以“new”或“alloc”开头的方法或包含副本的方法获得对象。

Cocoa Memory Management Rules

因此,除非事先已经[自我保留],否则对象不得进行[自我释放]或[自我释放]。

答案 2 :(得分:4)

引用伟大的哲学家Alicia Silverstone,“I had an overwhelming sense of ickiness”,当我读到它时。但我真的不能告诉你原因。

我想我会使用autorelease而不是简单的release,因为当你调用它时,你仍然在self执行代码,但除此之外我无法想到任何技术原因导致它不起作用。

答案 3 :(得分:3)

这是合法的,但要小心。你希望确定在你释放后别的任何东西都不会给你发消息。

在我们拥有CoreData之前,我已经为故障方案做了这种事情。

答案 4 :(得分:3)

协议的一部分是,如果你向自己发送版本,那么你应该发送一次保留,我想做。然后没有什么可疑的。我的意思是分配代码必须能够控制实例的生命周期;它本身只能延长它的寿命,永远不会缩短它(因为它缩短了,然后你突然离开实例的分配所有者,指针无效)。

答案 5 :(得分:2)

我将使用[self autorelease]而不是[self release]。因为通常是在

中调用
- (void)aMethod
{
    [self.delegate aDelegateMethod:self];
    [self release];

//If you add code related to self here, after [self release], you are making a huge mistake.
}

如果我使用[自我自动释放],我仍然可以在自动释放后做一些事情。