ios - NSError** 问题在多功能调用中反向传播

标签 ios objective-c error-handling nserror

在多功能调用中面临错误反向传播的问题。

例如,

NSError *error = nil;
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error];
if (error) {
   //error
}

接下来,它进入功能:

- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError *__autoreleasing*)err
{
 ....
 ....
 [self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:err];
  if(err && *err) {
   [newPlanFolder.managedObjectContext performBlockAndWait:^{
 [EMSPlanFolder deletePlan:newPlanFolder];
    }];
  return nil;
  }
 return newPlanFolder;
}

接下来,它去:

   - (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError *__autoreleasing*)err {
     ....
     ....
     if(err) {
      *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}];
     }
     return;
    }

问题是,当它反向传播到第一个代码片段时会导致崩溃。对此有何建议

最佳答案

Apple 框架通常在嵌套的自动释放池中执行 block 。您的错误引用是自动释放的,因此当 block 完成执行时错误被释放。为避免这种情况,请使用强大的本地 __block 变量来保留错误。尝试这样的事情:

__block NSError *theError = nil;

[context performBlockAndWait:^{
     //
    [self deserializePlan:parsedPlan 
                  forPlan:newPlanFolder 
        allowingNoEndDate:NO 
                withError:&theError]; // <- store the error ARP safe
}];
*err = theError;

关于ios - NSError** 问题在多功能调用中反向传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45519106/

相关文章:

ios - 在 swift 2.0 中暂停 mp3 文件

objective-c - Objective C 泛型 - 条件编译

objective-c - 使用 QuickLook 预览 PDF 会导致分配无限增加

powershell - 需要帮助捕获 PowerShell 中的错误消息

c# - 在C#中写行错误

ios - 键盘在 ios7 (Xcode 6) 中无法正常工作

objective-c - 如何在 iOS 中加载 XIB

function - Octave 的默认LU分解函数错误

ios - 如何缩短选择和移动元件的触摸时间? (使用 UICollectionViewDragDelegate)

iphone - 如何替换整个操作系统的默认字体