我有一个块用作 NSURLConnection 异步请求的completionHandler,其主要工作是使用新请求完成处理程序的相同块生成新的异步请求。我这样做是因为它有效地解决了另一个问题,即排列一系列异步调用并在后台触发它们。这对我们来说非常有效,但我们有一个我担心的警告。也就是说,XCode 认为我有一个保留周期。也许我知道,我不知道。在过去的几个小时里,我一直在尝试了解块,但我还没有找到像我这样的递归使用的解释。警告状态“块将被捕获的对象保留”。
到目前为止,我最好的猜测是保留周期正是我们想要的,并且当我们完成时要清除,我们只是将块变量取消,我正在做的。它并没有消除错误,但我不介意,只要我不泄漏内存或做一些我不知道的黑魔法。任何人都可以解决这个问题吗?我处理对了吗?如果没有,我该怎么办?
void (^ __block handler)(NSURLResponse *, NSData *, NSError*);
handler = ^(NSURLResponse *response, NSData *data, NSError *error)
{
[dataArray addObject:data];
if (++currentRequestIndex < [requestsArray count])
{
if (error)
{
[delegate requestsProcessWithIdentifier:_identifier processStoppedOnRequestNumber:currentRequestIndex-1 withError:error];
return;
}
[delegate requestsProcessWithIdentifier:_identifier completedRequestNumber:currentRequestIndex-1]; // completed previous request
[NSURLConnection sendAsynchronousRequest:[requestsArray objectAtIndex:currentRequestIndex]
queue:[NSOperationQueue mainQueue]
completionHandler:handler]; // HERE IS THE WARNING
}
else
{
[delegate requestsProcessWithIdentifier:_identifier completedWithData:dataArray];
handler = nil;
}
};
[NSURLConnection sendAsynchronousRequest:[requestsArray objectAtIndex:0]
queue:[NSOperationQueue mainQueue]
completionHandler:handler];