多功能调用中的NSError**问题回传

11

在多功能调用的反向传播中遇到问题。

例如,

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;
    }
问题是,当它向第一个代码片段进行反向传播时,会导致崩溃。对此有什么建议吗?

2
你能展示一下崩溃描述和它的堆栈跟踪吗? - Phillip Mills
请问您能否添加上述函数中出现的崩溃细节? - CodeChanger
抱歉,没有记录崩溃的描述,我只收到了一条消息,指出“exc_bad_access code=exc_i386_gpflt”。 - user1302553
*** -[NSError retain]: 发送给已释放实例 0x6000056545e0 的消息 - user1302553
你的第三段代码中的错误生成是在代码块中进行的吗,例如在 NSManagedObjectContextperformBlockAndWait: 中? - clemens
显示剩余2条评论
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1

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

__block NSError *theError = nil;

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

0

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,