确定是否已取消分配弱引用对象

时间:2011-12-12 13:06:38

标签: objective-c ios

我使用以下代码下载图片:

- (void)downloadImageAtUrl:(id)url
               andDelegate:(id<IPServerDelegate>)delegate_ {
  NSURL *correctUrl = nil;
  if ([url isKindOfClass:[NSString class]])
    correctUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kHostURL, [url substringFromIndex:1]]];
  else
    correctUrl = url;
  __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:correctUrl];
  [imageRequestsArray addObject:request];
  [request setCompletionBlock:^{
    if (request.responseStatusCode == 200) {
      if (delegate_ && [delegate_ respondsToSelector:@selector(didDownloadImage:atUrl:)]) {
        [delegate_ didDownloadImage:request.responseData atUrl:request.url];
      }
    }
    else {
      if (delegate_ && [delegate_ respondsToSelector:@selector(failedToDownloadImageWithUrl:)]) {
        [delegate_ failedToDownloadImageWithUrl:request.url];
      }
    }
    [imageRequestsArray removeObject:request];
  }];

  [request setFailedBlock:^{
    if (delegate_ && [delegate_ respondsToSelector:@selector(failedToDownloadImageWithUrl:)]) {
      [delegate_ failedToDownloadImageWithUrl:request.url];
    }
    [imageRequestsArray removeObject:request];
  }];

  [request startAsynchronous];
}

如果已取消分配delegate_对象,则应用程序崩溃。如何确定对象delegate_已被解除分配而无需创建对它的直接引用?我知道iOS 5中的__weak指针,但我的应用程序必须与iOS 4.3兼容。

2 个答案:

答案 0 :(得分:0)

好吧,当你的delegate_被解除分配时,我认为它是释放。如果是,则在:

之后
[object release];

这样做:

object=nil;

然后,在您的代码上,检查它是否存在:

if(delegate_){

}

答案 1 :(得分:0)

好的,所以我找到了解决方案。我将所有ASIHTTPRequest对象存储在请求数组中。当我的任何UIViewControllers即将消失时(viewWillDisappear),我通过数组枚举并向每个请求对象发送取消消息。这里唯一的不便是每次再次出现视图时都必须恢复这些请求,但至少它不会崩溃。