我遇到了崩溃,但只是在临时版本中。调试版本工作正常但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或者它永远不会出现。