Objective-c:从方法返回自动释放的对象

时间:2012-05-08 22:46:59

标签: objective-c methods nsarray autorelease nsobject

是什么阻止了NSArray的自动释放实例在它返回的方法中被使用之前被释放?

- (NSArray *) f {
    return [NSArray array];
}

- (void) g {
    NSArray *a = [self f];
    // do something with a
}

3 个答案:

答案 0 :(得分:5)

  

什么阻止NSArray的自动释放实例被释放   在它被用于方法之前它会返回?

自动释放池每个线程。也就是说,自动释放的对象实际上是对每个线程发生的release的延迟调用。

因此,如果在调用者和被调用者之间没有调用drain,则由于池消耗而导致自动释放的对象无法释放(除非严重的线程愚蠢)。

一般来说,游泳池会在非常明确的时间排水,凯文说:

•运行循环将在每次通过循环的底部排空池

•通过GCD调度的块将在池中进行,该池上下文将“不时被消耗”(实现细节)。 NSOperationQueue的行为类似

•其他线程负责自行完成

因此,在您的简单示例中,代码执行非常线性,并且通过检查,返回和调用者中的使用之间的执行线程不会消耗。

(请注意,这也是retainCount无用的原因之一;它既没有考虑autorelease引起的任何“延迟释放”调用,也没有量化任何每线程保留。实际上,你应该认为保留/发布完全是每个线程;如果你在一个线程上保留一个对象,你应该在同一个线程上释放它,除非你明确地将所有权从一个线程转移到另一个线程 。)

答案 1 :(得分:4)

自动释放的对象仅在其周围的池被耗尽时才会释放。这不是幕后发生的一些神奇过程。这是一个在明确定义的时间发生的确定性事件。通常,当控制返回到运行循环时,池将被耗尽。如果您建立自己的嵌套池,则可以控制何时耗尽。

答案 2 :(得分:2)

在事件循环的迭代期间,自动释放池被耗尽。由于它会导致释放消息被发送到自动释放的对象,因此它们在调用方法中仍然有效。