如果我使用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]
?
重要:我会等一个解释和答案。谢谢你
答案 0 :(得分:2)
只有在使用Autorelease方法的对象时,自动释放池才有效。
如果你正在使用它:
urlList = [[NSMutableArray alloc] init];
然后你会想要自己发布,是的。但是,如果你这样做:
urlList = [[[NSMutableArray alloc] init] autorelease];
然后你可以让NSAutorelease池处理它。
答案 1 :(得分:1)
如果您不想发布urlList
和target
,则可以使用此代码:
- (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];
这种情况下将使用自动释放,对于此类函数(方法),您需要拥有自己的单独自动释放池。
希望这会有所帮助。