如何使用 NSAutoreleasePool
Posted
技术标签:
【中文标题】如何使用 NSAutoreleasePool【英文标题】:How to use 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]
?
重要提示:我会等待解释和答复。谢谢
【问题讨论】:
【参考方案1】:只有当你有使用 Autorelease 方法的对象时,自动释放池才有效。
如果你使用这个:
urlList = [[NSMutableArray alloc] init];
然后你会想做你自己的发布,是的。但是,如果您这样做:
urlList = [[[NSMutableArray alloc] init] autorelease];
然后你可以让 NSAutorelease 池来处理。
【讨论】:
【参考方案2】:如果你不想释放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 被释放时被释放。
如果您需要更多信息,请在下面给我留言。
【讨论】:
如果我们在做自动释放,那么写池的需要是什么。你能解释一下吗?在主线程上写自动释放池是不是很好。 (根据下面的严重山姆)。 @ArpitParekh:是的,Arpit 最好不要使用自动释放,但由于我们使用的是后台任务,所以我们使用了自动释放池。也是的,感谢您指出错误的代码。再次感谢 您好,现在您编辑的代码不正确。您之前的代码是正确的。我担心的是为什么我们要在 main 方法上编写自动释放池。您已经告诉过后台任务。这是正确的。谢谢 @ArpitParekh:你好 Arpit,这个方法backgroundRequest
也可以从 NSThread 调用。它的名字暗示它是一个后台请求。希望现在很清楚。
:谢谢伙计。我忘了在你的代码中考虑背景请求方法“名称”。【参考方案3】:
我赞同@Brayden 的回答。我想补充一下。 通常每个线程都有它的自动释放池。例如,查看您的 .main 文件。它有一个与之关联的自动释放池。这样你的主线程就有了一个自动释放池。 现在,当您生成另一个线程时,即尝试在另一个线程上运行一些方法,以及是否要使用类方法进行常见初始化。
eg: NSString *strTem = [NSString stringWithString:AnotherString];
这就是使用自动释放的情况,对于这些功能(方法),您需要拥有自己的单独的自动释放池。
希望这会有所帮助。
【讨论】:
以上是关于如何使用 NSAutoreleasePool的主要内容,如果未能解决你的问题,请参考以下文章
NSRunLoop 和 NSAutoreleasePool,它们是如何交互的?
我如何找到因为缺少 NSAutoreleasePool 而泄漏的线程?
如何启动一个 NSRunLoop,并确保它有一个被清空的 NSAutoreleasePool?
在 MKMapview regionDidChangeAnimated 方法中使用 NSAutoreleasepool 时应用程序崩溃