我是cocoa-touch的新手,也是非常非托管的语言。虽然我已经牢牢掌握了语法,但我正在质疑我是否正确地发布了一个对象。
我有一个创建对象的视图
Communication *comm = [[Communication alloc] init];
[comm doSomething];
[comm release];
我知道我必须销毁这个对象,因为我正在分配它,它不会自动释放。
我在对象上调用一个方法,该方法发送到我的服务器并获取信息。当数据返回时,它会抛出我的“消息调度程序”响应的事件。我不想破坏对象,直到它从服务器返回 - 这就是我的困惑所在。
DataFinishedLoading
对象的comm
事件中。它应该自我毁灭吗?这是正确的方法吗?调用我的对象的视图基本上是说,创建这个对象,调用这个方法,然后开始你的快乐方式。它不关心调用方法后发生了什么 - 它是否带回信息。它只是侦听一个方法,用于以后可能遇到的任何数据。我没有理由挂在对象的引用上,因为在我打电话后我永远不会使用相同的实例 - 除了我自己之后的清理。
答案 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
将释放它。