NSError** issue back propagate in multi function call
Try this:
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;}
Apple frameworks often execute blocks in nested autorelease pools. Your error reference is autoreleasing, and thus the error is released when the block has finished executing. To avoid this use a strong local __block
variable to keep the error. Try something like that:
__block NSError *theError = nil;[context performBlockAndWait:^{ // [self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:&theError]; // <- store the error ARP safe}];*err = theError;