是什么阻止了NSArray
的自动释放实例在它返回的方法中被使用之前被释放?
- (NSArray *) f {
return [NSArray array];
}
- (void) g {
NSArray *a = [self f];
// do something with a
}
答案 0 :(得分:5)
什么阻止NSArray的自动释放实例被释放 在它被用于方法之前它会返回?
自动释放池每个线程。也就是说,自动释放的对象实际上是对每个线程发生的release
的延迟调用。
因此,如果在调用者和被调用者之间没有调用drain
,则由于池消耗而导致自动释放的对象无法释放(除非严重的线程愚蠢)。
一般来说,游泳池会在非常明确的时间排水,凯文说:
•运行循环将在每次通过循环的底部排空池p>
•通过GCD调度的块将在池中进行,该池上下文将“不时被消耗”(实现细节)。 NSOperationQueue的行为类似
•其他线程负责自行完成
因此,在您的简单示例中,代码执行非常线性,并且通过检查,返回和调用者中的使用之间的执行线程不会消耗。
(请注意,这也是retainCount
无用的原因之一;它既没有考虑autorelease
引起的任何“延迟释放”调用,也没有量化任何每线程保留。实际上,你应该认为保留/发布完全是每个线程;如果你在一个线程上保留一个对象,你应该在同一个线程上释放它,除非你明确地将所有权从一个线程转移到另一个线程 。)
答案 1 :(得分:4)
自动释放的对象仅在其周围的池被耗尽时才会释放。这不是幕后发生的一些神奇过程。这是一个在明确定义的时间发生的确定性事件。通常,当控制返回到运行循环时,池将被耗尽。如果您建立自己的嵌套池,则可以控制何时耗尽。
答案 2 :(得分:2)
在事件循环的迭代期间,自动释放池被耗尽。由于它会导致释放消息被发送到自动释放的对象,因此它们在调用方法中仍然有效。