释放对象会破坏对象吗?

时间:2011-06-03 15:42:12

标签: cocoa-touch memory-management

我是cocoa-touch的新手,也是非常非托管的语言。虽然我已经牢牢掌握了语法,但我正在质疑我是否正确地发布了一个对象。

我有一个创建对象的视图

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

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

我在对象上调用一个方法,该方法发送到我的服务器并获取信息。当数据返回时,它会抛出我的“消息调度程序”响应的事件。我不想破坏对象,直到它从服务器返回 - 这就是我的困惑所在。

  1. 如果我在拨打电话后直接释放此对象,它会破坏对象吗? (我不想这样做。)
  2. 如何在使用我正在等待的数据抛出事件后正确销毁此对象?这将发生在DataFinishedLoading对象的comm事件中。它应该自我毁灭吗?这是正确的方法吗?
  3. 调用我的对象的视图基本上是说,创建这个对象,调用这个方法,然后开始你的快乐方式。它不关心调用方法后发生了什么 - 它是否带回信息。它只是侦听一个方法,用于以后可能遇到的任何数据。我没有理由挂在对象的引用上,因为在我打电话后我永远不会使用相同的实例 - 除了我自己之后的清理。

2 个答案:

答案 0 :(得分:3)

如果最后一个固定器释放了它,则release只会销毁该对象。

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

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

答案 1 :(得分:2)

在上面的示例中,当您致电comm时,release 可能会被销毁。这取决于在doSomething期间保留的其他内容。

如果要在异步执行某个操作时保留该对象,请将其放在保留属性中。当它通知您已完成时,将属性设置为nil将释放它。