有关Objective-C 的僵尸错误有关问题
有关Objective-C 的僵尸异常问题《Learn Objective-C on the Mac》,中文版翻译为《Objective-C基础教程》这本
有关Objective-C 的僵尸异常问题
《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];,所以不应该有僵尸异常的问题。请大家帮忙解释一下,书上为什么说会产生僵尸异常,还是我代码没有调试对?谢谢大家帮忙解惑。 Objective-C 异常
[解决办法]oc is not exception-safe
少用try-catch block
[解决办法]推荐使用ARC