2017-08-05 2 views
11

マルチファンクションコールでエラーのバックプロパゲーションの問題が発生しました。例えば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; 
    } 

問題は、それがときにクラッシュにつながる、ありますバックは最初のコードスニペットに伝播します。それ

+2

クラッシュの説明とスタックトレースを表示できますか? –

+0

上記の機能に遭遇しているクラッシュの詳細を追加できますか?\ – CodeChanger

+0

クラッシュの説明は記録されません。「exc_bad_access code = exc_i386_gpflt」というメッセージが表示されます。 – iNeo

答えて

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

アップルのフレームワークは、多くの場合、ネストされた自動解放プールでブロックを実行します。エラー参照はオートリリースであるため、ブロックの実行が終了するとエラーが解除されます。これを避けるには、エラーを防ぐために強いローカル__block変数を使用します。

__block NSError *theError = nil; 

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