2011-06-03 84 views
3

我是新来的可可触摸,和真正的非托管语言在一起。尽管我对语法有了很好的把握,但我在质疑我是否正确释放了一个对象。释放一个对象是否会销毁该对象?

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

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

我知道我有,因为我拨作销毁这个对象,它不会自动释放。

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

  1. 如果我在进行调用后直接释放这个对象,它是否会销毁对象? (我不想这样做)
  2. 如何正确地销毁此对象并将其引发到正在等待的数据之后?这发生在我的comm对象上的DataFinishedLoading事件中。它是否应该摧毁自己,这是否是正确的做法?

调用我的对象的视图基本上说,创建这个对象,调用这个方法,并且开始你的快乐方式。它不关心它调用方法后会发生什么 - 无论它是否带回信息。它只是监听上的一种方法,以便以后可能会遇到的任何数据。我没有理由挂在对象的引用上,因为在我打电话后,我将永远不会使用同一个实例 - 除了自己清理之外。

回答

3

A release只有在最后一个固定器释放它时才销毁对象。

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

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

+0

是否可以将我的Communication对象设置为自动完成后自动释放? – 2011-06-03 15:51:03

+0

@George:你可以做'comm = [[[Communication [alloc] init] autorelease];',并且一旦你离开了你所做的这个方法,这个对象就会被释放一次(但你不知道什么时候,并且不需要关心)。你可能的意思是,*我希望物体一旦完成工作就消失。这很棘手。最好的方法是以某种方式告知工作完成(例如通过委托方法),并让对象的创建者释放它。但是,一个对象不应该(自我释放);或者什么的,如果这就是你的意思。虽然可能,但这是一种糟糕的风格和混乱。 – DarkDust 2011-06-03 15:57:09

+0

在我从视图中调用对象并在稍后的日期返回数据之后,Communication对象将向我的应用程序委托发信号通知我的服务器通过订阅发送了某些内容。那时,通信对象已经完成了所有的工作,而且不再需要它 - 至少是那个实例。在那里发布它是否合适?或者是你建议的[自我释放]? – 2011-06-03 16:00:52

2

在上例中,comm可能在您致电release时被销毁。这取决于在doSomething期间保留它。

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