如何在objective-c中自毁一个对象?

时间:2011-09-24 18:18:03

标签: objective-c object delegates

我的对象完成了他们的工作。他可以控制工作流程,但现在必须在创建它的对象中调用一个函数并且必须被释放。问题是这样的:

AnObject *object;
- (void)function 
{
     object = [[AnObject alloc] init];
     [object doYourJob];
     //The program continue to run next line, it don't stop here. So, I can't send a [object release] here
}

- (void)callThisWhenFinish
{
 //do something
 //can't call [object release] because it is in the stack and run a line of a released object
}

那么,我怎样才能释放对象的内存,我试试这个:

  • [object release]callThisWhenFinish中发送function。 - 失败!该程序仍然需要运行一些AnObject行。
  • 使用委托方式运行callThisWhenFinish。 - 失败!我无法释放AnObject,因为它会在函数callThisWhenfinish完成时尝试运行下一行。
  • 使用NSNotificationCenter向callThisWhenFinish发布通知。失败!当我发布通知时,立即致电callThisWhenFinishAnObject可以运行下一行,然后发布,导致崩溃。
  • 使用相同的NSNotificationCenter并延迟。这种方式有多安全?我怎么知道AnObject不会被再次调用?
  • 使用[对象自动释放]。这项工作,但我不知道什么时候完成。我的AnObject使用了大量内存,必须尽快释放。

还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

如果您的对象正在进行后台工作,那么在此期间让它保留自己是个好主意。这样,您不必担心在完成之前将其解除分配。您的function方法可以在启动操作后安全地释放它,但在准备好之前不会释放它。

AnObject *object;
- (void)function {
    object = [[AnObject alloc] init];
    [object doYourJob];
    [object release];
}
- (void)callThisWhenFinish {
    //do something
}

在AnObject中:

- (void)doYourJob {
    [self retain];
    // enter background and call backgroundMethod
}
- (void)backgroundMethod {
    // This is the method which doYourJob calls in the background to do the work
    // Do some work
    [delegate callThisWhenFinish];
    // do whatever else needs to be done
    [self release];
}

答案 1 :(得分:1)

如果你不能把它变成伊娃,为什么不能这样:

 - (void)callThisWhenFinishAndRelease:(id)obj

然后你有一个指向它的指针。