释放对象会销毁对象吗?

3

我是cocoa-touch的新手,对于非托管语言完全不熟悉。虽然我对语法有很好的掌握,但我怀疑我是否正确释放了对象。

我有一个视图创建了一个对象,

Communication *comm = [[Communication alloc] init];
[comm doSomething];
[comm release];

我知道我必须销毁这个对象,因为我正在分配它并且它不会自动释放。

我调用对象上的一个方法,该方法向我的服务器发送请求并获取信息。当数据返回时,它会触发一个事件,我的“消息分发器”会响应该事件。在它从服务器返回之前,我不想销毁这个对象--这就是我的困惑所在。

  1. 如果我在调用后直接释放这个对象,它会被销毁吗?(我不想这样做。)
  2. 在它抛出包含我等待的数据的事件后,我该如何正确地销毁这个对象?这将在我的comm对象的DataFinishedLoading事件中发生。它应该自我销毁吗?这是正确的做法吗?

调用我的对象的视图本质上是说,创建这个对象,调用这个方法,然后继续你的快乐。它不关心在调用方法后发生了什么--无论它是否带回信息。它只是在一个方法上“听取”以后可能出现的任何数据。我没有保留对象的引用的理由,因为在调用后我永远不会再使用同一个实例--除了清理自己的工作以外。

2个回答

3

release 只有在最后一个保留者释放它时才会销毁对象。

例如,假设你分配了 Communication 对象。它隐式地被保留了一次。然后你保留了它五次。你需要释放/自动释放对象六次,直到它被销毁(调用它的 dealloc 方法)。

有一个内部计数器,retainCount。当你创建一个对象时,它被设置为 1。现在每个 retain 增加计数器,每个 release 减少计数器。autorelease 也会减少计数器,但不会立即减少。一旦计数器降至 0,Objective-C 就知道该对象不再需要,并销毁它(通过调用对象的 dealloc)。警告:不要依赖于 retainCount,甚至不要查看它。你只需要关心你的 alloc/copy/new/retain 调用是否与相应的 release/autorelease 平衡。


我的通讯对象完成后是否可以自动释放? - George Johnston
@George: 你可以这样做 comm = [[[Communication alloc] init] autorelease];,一旦你离开创建该对象的方法,对象会被释放一次(但你不知道具体什么时候,也不需要关心)。你可能是想说,我希望对象在完成工作后消失。这就比较棘手了。最好的方法是通过某种方式发出信号表明工作已经完成(例如通过委托方法),然后由对象的创建者释放它。但是,对象不应该执行 [self release]; 或类似的操作,如果你是这个意思的话。虽然可能可行,但这样做不好,容易引起混淆。 - DarkDust
当我从我的视图调用对象并在以后的日期返回数据时,通信对象将通过订阅向我的应用委托发出来自服务器的内容的信号。此时,通信对象已经完成了所有工作,并且不再需要它--至少是该实例。在那里释放它是否适当?或者这是你所反对的[self release]吗? - George Johnston
@George:你可以这样做:控制器使用[[Communication alloc] init];来分配它,并将其存储在实例变量中。在此处不需要调用release。我假设该控制器是委托。你的对象完成工作后,然后调用委托/控制器。现在,控制器会对通信对象调用release(并将变量设置为nil)。 - DarkDust

2

在您的上述示例中,当您调用release时,comm很可能会被销毁。这取决于其他什么东西在doSomething期间保留它。

如果您想在异步执行某项任务时保留对象,请将其放入保留的属性中。当它通知您完成时,将该属性设置为nil,这将释放它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接