Cocoa touch 释放对象会破坏对象吗?
我不熟悉cocoa touch,而且所有的语言都是非托管语言。虽然我牢牢掌握了语法,但我怀疑我是否正确地释放了一个对象 我有一个视图可以创建一个对象Cocoa touch 释放对象会破坏对象吗?,cocoa-touch,memory-management,Cocoa Touch,Memory Management,我不熟悉cocoa touch,而且所有的语言都是非托管语言。虽然我牢牢掌握了语法,但我怀疑我是否正确地释放了一个对象 我有一个视图可以创建一个对象 Communication *comm = [[Communication alloc] init]; [comm doSomething]; [comm release]; 我知道我必须销毁这个对象,因为我正在分配它,它不会自动释放 我调用对象上的一个方法,该方法将输出到我的服务器并获取信息。当数据返回时,它抛出一个事件,我的“消息调度器”对此
Communication *comm = [[Communication alloc] init];
[comm doSomething];
[comm release];
我知道我必须销毁这个对象,因为我正在分配它,它不会自动释放
我调用对象上的一个方法,该方法将输出到我的服务器并获取信息。当数据返回时,它抛出一个事件,我的“消息调度器”对此作出响应。在对象从服务器返回之前,我不想销毁它——这就是我的困惑所在
comm
对象上的datafinishedload
事件中。它应该自我毁灭吗?这是正确的方式吗调用我的对象的视图本质上是这样的,创建这个对象,调用这个方法,然后继续你的快乐之路。它不关心调用该方法后会发生什么——不管它是否返回信息。它只是在方法上侦听以后可能遇到的任何数据。我没有理由挂起对象的引用,因为我在调用后将永远不会使用相同的实例——这是除了在我自己之后清理之外。在上面的示例中,
comm
很可能在调用release
时被销毁。它取决于其他东西在做某事时保留它
如果您希望在对象异步执行某项操作时保留该对象,请将其放在保留属性中。当它通知您该操作已完成时,将属性设置为nil
,这将释放该对象。Arelease
仅在最后一个固定器释放该对象时才销毁该对象
例如,假设您分配了通信
对象。它隐式保留一次。然后你保留它五次。您需要释放/自动释放对象六次,直到它被销毁(调用其dealloc
方法)
有一个内部计数器,retainCount
。创建对象时,将其设置为1
。现在,每次retain
增加计数器,每次release
减少计数器<代码>自动释放也会减少计数器,但不会立即减少。一旦计数器降至0,Objective-C就知道不再需要该对象并将其销毁(通过调用该对象的dealloc
)警告:不要依赖于重新计数
,甚至不要查看它。您应该只关心您的alloc/copy/new/retain
调用稍后是否与相应的release/autorelease
平衡。是否可以将我的通信对象设置为在完成后自动释放自己?@George:您可以执行comm=[[Communication alloc]init]autorelease]代码>,一旦您离开了进行此操作的方法,对象将被释放一次(但您不知道何时释放,也不需要在意)。你可能是说,我希望物体一旦完成工作就消失。这是更棘手的。最好的方法是以某种方式发出工作已完成的信号(例如,通过委托方法),并让对象的创建者释放它。但是一个对象不应该做[自我释放]代码>或者什么的,如果你是这个意思的话。虽然可能,但它的风格不好且令人困惑。在我从视图中调用该对象并在稍后返回数据后,通信对象将向我的应用程序代理发出信号,表示通过订阅来自我的服务器。此时,通信对象已经完成了所有的工作,不再需要它了——至少不再需要它的实例。在那里发布是否合适?或者这就是你建议反对的[自我释放]。@George:你会这样做:控制器分配它,使用[[Communication alloc]init]
并将其存储在实例变量中。您不能在此处调用release
。我假设这个控制器是委托。对象完成工作,然后调用委托/控制器。控制器现在对通信对象调用release
(并将变量设置为nil
)。