当前位置:  开发笔记 > IOS > 正文

NSAutoreleasePool自动释放池如何工作?

如何解决《NSAutoreleasePool自动释放池如何工作?》经验,为你挑选了4个好方法。

据我了解,任何使用alloc,newcopy创建的东西都需要手动释放.例如:

int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
}

不过,我的问题是,这不是有效吗?:

int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
}

kperryua.. 67

是的,你的第二个代码snippit是完全有效的.

每次--autorelease被发送到一个对象,它被添加到最里面的自动释放池.当池耗尽时,它只是向池中的所有对象发送-release.

自动释放池只是一种便利,允许您推迟发送 - 直到"以后"."稍后"可能会在几个地方发生,但Cocoa GUI应用程序中最常见的是在当前运行循环周期结束时.



1> kperryua..:

是的,你的第二个代码snippit是完全有效的.

每次--autorelease被发送到一个对象,它被添加到最里面的自动释放池.当池耗尽时,它只是向池中的所有对象发送-release.

自动释放池只是一种便利,允许您推迟发送 - 直到"以后"."稍后"可能会在几个地方发生,但Cocoa GUI应用程序中最常见的是在当前运行循环周期结束时.


不应该"最外面"是"最内在的"?
如果我没有循环,那么当前运行循环周期的结束?

2> mmalc..:

NSAutoreleasePool:排水与释放

由于drain并且release似乎引起混淆的功能,这里可能值得澄清(虽然这在文档中有所涉及......).

严格地说,从大局的角度drain等同于release:

在引用计数环境中,drain执行相同的操作release,因此两者在这种意义上是等价的.要强调,这意味着如果您使用而不是,则不会泄漏池.drainrelease

在垃圾收集环境中,release是无操作.因此它没有效果. drain另一方面,它包含了一个收集器的提示,它应该"在需要时收集".因此,在垃圾收集环境中,使用drain有助于系统平衡收集扫描.


这与我写的内容有什么关系?
从根本上说'泄漏'NSAutoreleasePool`是不可能的.这是因为池像堆栈一样运行.实例化池会将该池推送到该线程自动释放池堆栈的顶部.`-release`导致该池从堆栈弹出**和**任何被推到它上面的池,但无论出于什么原因都没有弹出.
我喜欢他花时间大胆的和.*SNAP!*

3> Neovibrant..:

正如已经指出的那样,您的第二个代码段是正确的.

我想建议一种更简洁的方法来使用适用于所有环境的自动释放池(引用计数,GC,ARC),并避免排放/释放混淆:

int main(void) {
  @autoreleasepool {
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
  }
}

在上面的例子中,请注意@autoreleasepool块.这在此处记录.


请注意,ARC不允许自动释放.

4> kperryua..:

不你错了.文档明确指出,在非GC下,-drain相当于-release,这意味着NSAutoreleasePool 不会被泄露.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有