ios ASIFormDataRequest请求崩溃仅限Ad Hoc

时间:2013-11-07 01:30:21

标签: ios objective-c xcode asihttprequest

我遇到了崩溃,但只是在临时版本中。调试版本工作正常但adhoc崩溃。这是用ARC编译的,但是为了使用这个库,我为编译器标志设置了“-fno-objc-arc”。崩溃报告在这里:http://pastebin.com/edasCJbb

-(void)executePostRequestWithEndpoint:(NSString *)pathMethod usingVariables:(NSDictionary *)dict completion:(BWObjectBlock)completion failure:(BWFailureBlock)failure {

    NSURL *url = [NSURL URLWithString:pathMethod];
    __unsafe_unretained __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    NSLog(@"It gets to this NSLog and then crashes");
    [request addRequestHeader:@"User-Agent" value:kMyUserAgent];
    NSLog(@"It DOES NOT get to this NSLog");
    NSMutableDictionary *params = dict ? [NSMutableDictionary dictionaryWithDictionary:dict] : [NSMutableDictionary dictionary];
    if (params.count > 0) {
        for (NSString *key in [params allKeys]) {
            [request setPostValue: [[[params objectForKey:key] description] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey: key];
        }
    }
    [request setCompletionBlock:^{
        id json =[[request responseString] JSONValue];
        if ([json isKindOfClass:[NSDictionary class]]) {
        completion(json);
        }else{
            failure(json,nil);
        }
    }];
    [request setFailedBlock:^{
        id o = [[request responseString] JSONValue];
        failure(o,request.error);
    }];
    [request startAsynchronous];
}

我完全承认我并不确切地理解这些编译器标志的作用或__unsafe_unratained __block的作用。但我假设请求被立即释放,然后使用时访问不良。这个方法在应用程序中的第一次使用时崩溃,但通常可以连续多次调用以从我的服务器访问不同的东西,登录等等。所以我不能使用属性来获取该请求,因为它会获得在第二次请求时被覆盖。

当然这是使用Ben Copsey的ASIHttpRequest库,而不是ARC,而我的应用程序的其余部分是。

Xcode 5.0 从iPhone4S到5S的所有设备都经过测试和崩溃 - 但仅限于在Archive下编译。调试版本不会崩溃。 部署目标是5.0,但如果有帮助可以提升到6.0。

希望有人能向我解释这个__unsafe ......的东西并帮我弄清楚如何解决这个问题。

更新 - 使用以下答案解决了崩溃问题:

ASIHTTPRequest / ASIFormDataRequest - referencing request object within blocks under ARC

但该块无效。在调试版本上的工作仍然与在临时版本(PITA)上的工作方式不同。

我改变了:

__unsafe_unretained __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

为:

ASIFormDataRequest * __weak request = [ASIFormDataRequest requestWithURL:url];

变量现在保留足够长的时间以防止崩溃。但返回给调用者的是NULL或者它永远不会出现。

0 个答案:

没有答案