有关Objective-C 的僵尸异常问题

zhuyf87 2013-07-25 04:19:27
《Learn Objective-C on the Mac》,中文版翻译为《Objective-C基础教程》
这本书中提到下面这段代码会导致僵尸异常(zombie exception)
    
@try {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@try {
NSException *e = [NSException exceptionWithName:@"eTest" reason:@"test" userInfo:nil];
@throw e;
}
@catch (NSException *exception) {
i = 1;
@throw;
}
@finally {
i = 2;
[pool release];
}
}
@catch (NSException *exception) {
i = 3;
}
@finally {
i = 4;
}

NSLog(@"%d", i);

主要原因是,里面那个异常代码的@finally释放了自动释放池pool,而异常对象e也是有自动释放特性的。所以导致异常对象e在被@throw;重新抛出时就被释放了。
然后我就在Xcode中敲了这个代码,实际的断点调试发现,外层的异常处理@catch能够正常捕捉到内层@throw;重新抛出的异常,并且异常名字为eTest和异常reason为test都正常。我自己也感觉是应该是@throw;重新抛出异常执行之后,才执行的@finally里面的[pool release];,所以不应该有僵尸异常的问题。请大家帮忙解释一下,书上为什么说会产生僵尸异常,还是我代码没有调试对?谢谢大家帮忙解惑。
...全文
198 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
creso 2013-08-03
  • 打赏
  • 举报
回复
oc is not exception-safe 少用try-catch block
nimingzhe2008 2013-08-03
  • 打赏
  • 举报
回复
推荐使用ARC

29,049

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧