在init中引发异常时如何防止泄漏?

时间:2011-02-15 15:46:26

标签: objective-c memory-management memory-leaks

这是情况。假设我有一个名为MYFoo的课程。这是初始化程序:

-init
{
  self = [super init];
  if (self)
  {
    // during initialization, something goes wrong and an exception is raised
    [NSException raise ...];
  }
  return self;
}

现在我想在其他地方使用MYFoo对象,所以我使用了一个常见的模式:

MYFoo *foo = [[[MYFoo alloc] init] autorelease];

但是会发生什么,即使第二部分有一个try / catch,也会分配一个MYFoo对象,抛出异常,自动释放错过,未初始化的MYFoo对象将泄漏。

这里应该发生什么来防止这种泄漏?

2 个答案:

答案 0 :(得分:8)

Apple Docs说最佳做法不是扔掉。

  

处理初始化失败

     

一般来说,如果有问题   在初始化方法中,你   应该调用[自我释放]并返回   为零。

如果你需要知道发生了什么,你可以init对象并拥有某种内部状态,由调用者检查以确保对象可用。

答案 1 :(得分:1)

ongle是100%正确的。但是如果你确实需要抛出一个异常,而你确实希望在某个地方捕获它(而不是只是避开应用程序),那么你可以将你的初始化包装在@try { ... } @finally { ... }

-init
{
   self = [super init];
   if (self)
   {
       @try
       { 
           // during initialization, something goes wrong and an exception is raised
           @throw...
       }
       @finally
       {
           [self release]; 
       }
   }
   return self;
}

如果您执行上述操作,则应记录init方法可能引发异常,否则代码的其他用户将期望默认行为,并且可能不会编写异常安全代码。