【问题标题】:got EXC_BAD_ACCESS when I Cancel a Asynchronous web request by using ASIHTTPRequest当我使用 ASIHTTPRequest 取消异步 Web 请求时得到 EXC_BAD_ACCESS
【发布时间】:2010-01-25 00:09:22
【问题描述】:

我在 iPhone 模拟器中运行下面的示例代码没有问题,但是当我在 iPhone 中运行它时,当我调用 [asiRequest cancel] 时总是得到 EXC_BAD_ACCESS。有人可以帮忙吗?谢谢。

ASIHTTPRequest *asiRequest;

-(IBAction)request1{
    NSLog(@"request starting");
    [self sendRequest];
}
-(IBAction)cancel1{
    NSLog(@"request caceling");
    if(asiRequest)
        [asiRequest cancel];

}

-(void)sendRequest{
    asiRequest=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://maps.google.com/"]];
    [asiRequest setDelegate:self];
    [asiRequest startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSLog(@"requestFinished");
    asiRequest=nil;
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSLog(@"request Error=%@",[request error]);
    asiRequest=nil;
}

检查api后,我认为我不应该在requestFinished或requestFailed中释放它

完成后如何释放它?

- (void)cancel
{
    #if DEBUG_REQUEST_STATUS
    NSLog(@"Request cancelled: %@",self);
    #endif
    [[self cancelledLock] lock];

    if ([self isCancelled] || [self complete]) {
        [[self cancelledLock] unlock];
        return;
    }

    [self failWithError:ASIRequestCancelledError];
    [self setComplete:YES];
    [self cancelLoad];
    [[self cancelledLock] unlock];

    // Must tell the operation to cancel after we unlock, as this request might be dealloced and then NSLock will log an error
    [super cancel];
}

【问题讨论】:

    标签: iphone objective-c asihttprequest


    【解决方案1】:

    您需要保留您的 ASIHTTPRequest。因为请求是通过使用方便的构造函数自动释放的,所以您必须保留它,以便它在当前运行循环结束时保持不变。

    另外,请注意,在cancel1: 中不需要检查asiRequest 是否不是nil:向nil 发送消息没有任何作用,也没有负面影响。

    【讨论】:

      【解决方案2】:

      我又改了代码

      现在一切正常,我想我唯一需要担心的是,当 requestFailed 意外发生时,我需要在某处释放请求

      -(IBAction)request1{
          NSLog(@"request starting");
          [self sendRequest];
      }
      -(IBAction)cancel1{
          NSLog(@"request caceling");
          if(asiRequest){
              [asiRequest cancel];
              [asiRequest release];
              asiRequest=nil;
          }
      }
      
      -(void)sendRequest{
      
          asiRequest=[[ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://maps.google.com/"]] retain];
          [asiRequest setDelegate:self];
          [asiRequest startAsynchronous];
      }
      
      - (void)requestFinished:(ASIHTTPRequest *)request
      {
          NSLog(@"requestFinished");
          [asiRequest release];
          asiRequest=nil;
      }
      
      - (void)requestFailed:(ASIHTTPRequest *)request
      {
          NSLog(@"request Error=%@",[request error]);
      }
      

      【讨论】:

      • 这个问题我已经解决了,只要成功的时候在requestFinished中释放asiRequest,不要在requestFailed中释放,在其他地方释放。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多