ASIHTTPRequestTester:asynchronous不起作用

我正在尝试使用ASIHTTPRequest为iOS创build应用程序,但是我正在使用它来解决一些问题。 为了演示我的问题,我已经上传了一个testing项目,你可以从这里下载: http : //uploads.demaweb.dk/ASIHTTPRequestTester.zip 。

我创build了一个使用ASIHTTPRequestDelegate协议的WebService类:

 #import "WebService.h" #import "ASIHTTPRequest.h" @implementation WebService - (void)requestFinished:(ASIHTTPRequest *)request { NSLog(@"requestFinished"); } - (void)requestFailed:(ASIHTTPRequest *)request { NSLog(@"requestFailed"); } - (void) testSynchronous { NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; NSLog(@"starting Synchronous"); [request startSynchronous]; NSError *error = [request error]; if (!error) { NSLog(@"got response"); } } - (void) testAsynchronous { NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDelegate:self]; NSLog(@"starting Asynchronous"); [request startAsynchronous]; } @end 

同步方法工作正常,但asynchronous不工作。 首先requestFinished和requestFailed从来没有被调用,现在我得到一个EXC_BAD_ACCESS。 这两个testing方法是从我的ViewController的viewDidLoad调用的。 我希望有人能帮我做这个工作。

编辑1:按照这个主题 ,这是可能的,因为我的项目启用Automatic Reference Counting 。 该主题的build议添加一个[self retain] ,但我不能这样做与ARC打开。 任何人有这个解决scheme?

编辑2:根据MrMage的答案更新。

 @interface ViewController() @property (nonatomic,strong) WebService *ws; @end @implementation ViewController @synthesize ws = _ws; #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self setWs:[[WebService alloc] init]]; [self.ws testSynchronous]; [self.ws testAsynchronous]; } @end 

你可以添加你的WebService实例作为一个持久对象的强引用(比如你的视图控制器),然后告诉这个类在完成它的工作之后摆脱WebService (例如,在你调用requestFinishedrequestFailed回到视图控制器,告诉它释放WebService实例)。

我在ASIHTTPRequest和ARC的授权上遇到同样的问题。

我只是最终使用块来解决它。

 NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; //set request like this to avoid retain cycle on blocks __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; //if request succeeded [request setCompletionBlock:^{ [self requestFinished:request]; }]; //if request failed [request setFailedBlock:^{ [self requestFailed:request]; }]; [request startAsynchronous];