我是cocoa-touch的新手,对于非托管语言完全不熟悉。虽然我对语法有很好的掌握,但我怀疑我是否正确释放了对象。
我有一个视图创建了一个对象,
Communication *comm = [[Communication alloc] init];
[comm doSomething];
[comm release];
我知道我必须销毁这个对象,因为我正在分配它并且它不会自动释放。
我调用对象上的一个方法,该方法向我的服务器发送请求并获取信息。当数据返回时,它会触发一个事件,我的“消息分发器”会响应该事件。在它从服务器返回之前,我不想销毁这个对象--这就是我的困惑所在。
- 如果我在调用后直接释放这个对象,它会被销毁吗?(我不想这样做。)
- 在它抛出包含我等待的数据的事件后,我该如何正确地销毁这个对象?这将在我的comm对象的DataFinishedLoading事件中发生。它应该自我销毁吗?这是正确的做法吗?
调用我的对象的视图本质上是说,创建这个对象,调用这个方法,然后继续你的快乐。它不关心在调用方法后发生了什么--无论它是否带回信息。它只是在一个方法上“听取”以后可能出现的任何数据。我没有保留对象的引用的理由,因为在调用后我永远不会再使用同一个实例--除了清理自己的工作以外。
comm = [[[Communication alloc] init] autorelease];
,一旦你离开创建该对象的方法,对象会被释放一次(但你不知道具体什么时候,也不需要关心)。你可能是想说,我希望对象在完成工作后消失。这就比较棘手了。最好的方法是通过某种方式发出信号表明工作已经完成(例如通过委托方法),然后由对象的创建者释放它。但是,对象不应该执行[self release];
或类似的操作,如果你是这个意思的话。虽然可能可行,但这样做不好,容易引起混淆。 - DarkDust[[Communication alloc] init];
来分配它,并将其存储在实例变量中。在此处不需要调用release
。我假设该控制器是委托。你的对象完成工作后,然后调用委托/控制器。现在,控制器会对通信对象调用release
(并将变量设置为nil
)。 - DarkDust