如何使用NSAutoreleasePool

时间:2011-11-23 07:45:36

标签: iphone nsautoreleasepool

如果我使用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]重要:我会等一个解释和答案。谢谢你

3 个答案:

答案 0 :(得分:2)

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

如果你正在使用它:

urlList = [[NSMutableArray alloc] init];

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

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

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

答案 1 :(得分:1)

如果您不想发布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发布时发布。

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

答案 2 :(得分:0)

我是@Brayden的答案。我想补充一点。 通常每个线程都有自动释放池。例如,请参阅.main文件。它有一个与之关联的自动释放池。这样你的主线程就有了一个自动释放池。 现在当你产生另一个线程时,即尝试在另一个线程上运行某些方法,以及你是否会使用类方法进行常规初始化。

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

这种情况下将使用自动释放,对于此类函数(方法),您需要拥有自己的单独自动释放池。

希望这会有所帮助。