【问题标题】:NSError** issue back propagate in multi function callNSError** 问题在多功能调用中反向传播
【发布时间】:2018-01-13 02:50:48
【问题描述】:

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

例如,

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;
    }

问题是,当它反向传播到第一个代码 sn-p 时会导致崩溃。有什么建议

【问题讨论】:

  • 你能显示崩溃描述及其堆栈跟踪吗?
  • 您能否添加您正在使用上述功能的崩溃详细信息?\
  • 抱歉,没有记录崩溃描述,我只收到一条消息,说明“exc_bad_access code=exc_i386_gpflt”
  • *** -[NSError retain]: message sent to deallocated instance 0x6000056545e0
  • 第三个 sn-p 中的错误生成是否发生在代码块中,例如。 G。在NSManagedObjectContextperformBlockAndWait: 内?

标签: ios objective-c error-handling nserror


【解决方案1】:

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

__block NSError *theError = nil;

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

【讨论】:

    【解决方案2】:

    试试这个:

    NSError *error = nil;
    EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error];
    if (error) {
       //error
    }
    
    - (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError **)err
    {
     ....
     ....
     [self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:&err];
      if(err == nil) {
       [newPlanFolder.managedObjectContext performBlockAndWait:^{
     [EMSPlanFolder deletePlan:newPlanFolder];
        }];
      return nil;
      }
     return newPlanFolder;
    }
    
    - (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError **)err {
         ....
         ....
         if(err) {
          *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}];
         }
         return;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 2019-09-19
      • 2011-05-04
      • 2013-02-28
      • 2011-10-28
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多