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