2017-08-05 15 views
11

Đối mặt với một vấn đề trong việc truyền lại lỗi trong cuộc gọi đa chức năng.NSError ** phát hành lại vấn đề trong đa chức năng gọi

Ví dụ,

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

Tiếp theo, nó đi vào hoạt động:

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

Tiếp theo, nó đi vào:

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

Vấn đề là, nó dẫn đến sụp đổ khi nó trở lại tuyên truyền cho đoạn mã đầu tiên. Mọi góp ý về nó

+2

Bạn có thể hiển thị mô tả sự cố và theo dõi ngăn xếp của nó không? –

+0

Bạn có thể thêm chi tiết tai nạn mà bạn đang nhận được trên chức năng trên? \ – CodeChanger

+0

Xin lỗi không có mô tả vụ tai nạn được ghi lại, tôi chỉ nhận được một thông báo nói "exc_bad_access code = exc_i386_gpflt" – iNeo

Trả lời

0

Hãy thử điều này:

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

của Apple khuôn khổ thường thực hiện các khối trong hồ bơi autorelease lồng nhau. Tham chiếu lỗi của bạn là tự động phát hành và do đó, lỗi được phát hành khi khối đã hoàn thành việc thực thi. Để tránh điều này, hãy sử dụng biến số __block cục bộ mạnh để giữ lỗi. Hãy thử một cái gì đó như thế:

__block NSError *theError = nil; 

[context performBlockAndWait:^{ 
    // 
    [self deserializePlan:parsedPlan 
        forPlan:newPlanFolder 
     allowingNoEndDate:NO 
       withError:&theError]; // <- store the error ARP safe 
}]; 
*err = theError; 
Các vấn đề liên quan