- (void)foo
{
@try {
for (id o in os){
@autoreleasepool {
for (id o2 in moreOs){
// create a lot of autoreleased objects.
}
//exception raised
}
}
}
@catch (NSException *exception) {
// handle the exception
}
}发布于 2011-12-12 21:02:20
为了解决您的问题,在该池中创建的对象将不会被有效泄漏,直到堆栈中的某个自动释放池被耗尽为止。除了您的应用程序的主自动释放池之外,在堆栈的另一端可能没有池,这可能在一段时间内不会被耗尽。
如果捕捉到异常,请尝试以下操作,以强制在此方法返回时发生漏出。
- (void)foo
{
@autoreleasepool {
@try {
for (id o in os){
@autoreleasepool {
for (id o2 in moreOs){
// create a lot of autoreleased objects.
}
//exception raised
}
}
}
@catch (NSException *exception) {
// handle the exception
}
}
}根据文档,当最外层的自动释放池被排出时,它也会排出所有嵌套的。
如果您排出一个不是堆栈顶部的自动释放池,则堆栈上的所有(未释放的)自动释放池都会被耗尽(并且它们的所有对象都发送了适当的发布消息)。如果在完成自动释放池(不推荐的内容)时,忽略了将排水池发送到自动释放池,则当其中一个自释放池中的嵌套池被排出时,该池就会被耗尽。
从高级内存管理编程指南中的“自动释放池的范围及其嵌套自动释放池的含义”一节
发布于 2011-12-12 20:56:28
它将而不是排水池。来自过渡到ARC发行说明
进入时,会按下一个自动释放池。在正常出口(中断、返回、转到、通过等等),会弹出自动释放池。为了与现有代码兼容,如果退出是由于异常,则不会弹出自动释放池。
https://stackoverflow.com/questions/8480624
复制相似问题