【问题标题】:How to use NSAutoreleasePool如何使用 NSAutoreleasePool
【发布时间】:2011-11-23 07:45:35
【问题描述】:

如果我使用 NSAutoreleasePool,在池中创建的每个对象都不应该手动释放吗?它会在池耗尽时释放?

- (void) backgroundRequest{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        urlList = [[NSMutableArray alloc] init];
        target = [[NSMutableArray alloc] init];
      {
    //do stuff in here  

    }
    [urlList release];
    [target release];

    [pool release];
}

以上几行是否正确,或者我应该删除[urlList release][target release]重要提示:我会等待解释和答复。谢谢

【问题讨论】:

    标签: iphone nsautoreleasepool


    【解决方案1】:

    只有当你有使用 Autorelease 方法的对象时,自动释放池才有效。

    如果你使用这个:

    urlList = [[NSMutableArray alloc] init];
    

    然后你会想做你自己的发布,是的。但是,如果您这样做:

    urlList = [[[NSMutableArray alloc] init] autorelease];
    

    然后你可以让 NSAutorelease 池来处理。

    【讨论】:

      【解决方案2】:

      如果你不想释放urlListtarget,那么你可以使用这个代码:

      - (void) backgroundRequest
      {
          NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
      
              urlList = [[[NSMutableArray alloc] init] autorelease];
              target = [[[NSMutableArray alloc] init] autorelease];
            {
          //do stuff in here  
      
          }
      
          [pool release];
      }
      

      希望这对您有所帮助。

      关键是 AutoreleasePool 会处理那些使用关键字 autorelease 自动释放的分配,因此如果您使用该关键字,则不需要释放它。它在 AutoreleasePool 被释放时被释放。

      如果您需要更多信息,请在下面给我留言。

      【讨论】:

      • 如果我们在做自动释放,那么写池的需要是什么。你能解释一下吗?在主线程上写自动释放池是不是很好。 (根据下面的严重山姆)。
      • @ArpitParekh:是的,Arpit 最好不要使用自动释放,但由于我们使用的是后台任务,所以我们使用了自动释放池。也是的,感谢您指出错误的代码。再次感谢
      • 您好,现在您编辑的代码不正确。您之前的代码是正确的。我担心的是为什么我们要在 main 方法上编写自动释放池。您已经告诉过后台任务。这是正确的。谢谢
      • @ArpitParekh:你好 Arpit,这个方法 backgroundRequest 也可以从 NSThread 调用。它的名字暗示它是一个后台请求。希望现在很清楚。
      • :谢谢伙计。我忘了在你的代码中考虑背景请求方法“名称”。
      【解决方案3】:

      我赞同@Brayden 的回答。我想补充一下。 通常每个线程都有它的自动释放池。例如,查看您的 .main 文件。它有一个与之关联的自动释放池。这样你的主线程就有了一个自动释放池。 现在,当您生成另一个线程时,即尝试在另一个线程上运行一些方法,以及是否要使用类方法进行常见初始化。

      eg: NSString *strTem = [NSString stringWithString:AnotherString];

      这就是使用自动释放的情况,对于这些功能(方法),您需要拥有自己的单独的自动释放池。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多