Objective-c:从方法返回自动释放的对象
Posted
技术标签:
【中文标题】Objective-c:从方法返回自动释放的对象【英文标题】:Objective-c: returning autoreleased object from method 【发布时间】:2012-05-08 22:46:58 【问题描述】:是什么阻止了NSArray
的自动释放实例在它返回到的方法中使用之前被释放?
- (NSArray *) f
return [NSArray array];
- (void) g
NSArray *a = [self f];
// do something with a
【问题讨论】:
【参考方案1】:是什么阻止了自动释放的 NSArray 实例被释放 在它返回到的方法中使用之前?
自动释放池每个线程。也就是说,自动释放的对象实际上是对release
的延迟调用,它在每个线程的基础上发生。
因此,如果调用者和被调用者之间没有对drain
的调用,那么自动释放的对象就不会因为池耗尽而被释放(除非严重的线程愚蠢)。
一般来说,游泳池会在指定的时间排干,就像 Kevin 说的:
• run loop 将在每次通过循环的底部排出池
• 通过 GCD 分派的块将在池上下文中执行,该上下文将“不时地”耗尽(实现细节)。 NSOperationQueue 的行为类似
• 其他线程自行负责
因此,在您的简单示例中,代码执行是相当线性的,并且通过检查,在返回和调用者中的使用之间的执行线程中不会有任何消耗。
(请注意,这也是retainCount
无用的原因之一;它既不考虑由autorelease
引起的任何“延迟释放”调用,也不量化任何每个线程的保留。实际上,您应该将保留/释放视为完全每个线程;如果您在线程上保留一个对象,则应该在同一线程上释放它除非您明确地将所有权从一个线程转移到另一个线程。) p>
【讨论】:
【参考方案2】:自动释放的对象仅在其周围的池耗尽时才会释放。这不是幕后发生的一些神奇的过程。这是在明确定义的时间发生的确定性事件。通常,当控制返回到运行循环时,池会被耗尽。如果您建立自己的嵌套池,那么您可以控制何时耗尽。
【讨论】:
【参考方案3】:自动释放池在事件循环的迭代过程中被耗尽。由于释放消息会导致释放消息发送到自动释放的对象,因此它们在调用方法中仍然有效。
【讨论】:
不;与通过事件循环的每次传递相比,自动释放池的耗尽可能会更多或更少...... 鉴于问题的上下文,不是一个特别有趣的狡辩。 这就是我没有投反对票的原因;虽然它解释了 OP 的问题,但它也使 OP 有可能对池的工作方式有一个明显不正确的看法。以上是关于Objective-c:从方法返回自动释放的对象的主要内容,如果未能解决你的问题,请参考以下文章