首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Iphone >

有关Objective-C 的僵尸错误有关问题

2014-01-08 
有关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

热点排行