我从事同一个项目已经有一段时间了,随着时间的推移,我对 Objective-C 和 Cocoa 的理解也有了一些变化。回顾我的代码的某些部分,我看到了这一点:
__weak ASIFormDataRequest *serverQueueRequest = [ASIFormDataRequest requestWithURL:url2];
[serverQueueRequest setCompletionBlock:^{
NSLog(@"%@", serverQueueRequest.responseString);
}];
[serverQueueRequest startAsynchronous];
这就是我处理所有服务器请求的方式。我想我这样做是为了抑制警告,即“在块中捕获请求可能会导致保留周期”。所以我把它变弱了,这似乎解决了我所有的问题。我没有注意到任何真正的问题。
但是,现在看代码,它的工作原理似乎有点奇怪。当我将请求声明为__weak
时,由于没有人坚持它,它不应该立即归零吗?为什么这段代码有效?
另外,虽然这段代码有效,但我最近发现了一个不起作用的情况:当连续多次调用包含此代码的方法时,比如在一秒钟内调用 5 次,3/5 的请求将有NULL
响应. 情况一贯如此。删除__weak
限定符可以解决此问题。对此有何解释?
最后,声明这样的本地请求的正确方法是什么?
更新:根据这个问题,正确的做法是这样的:
ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:...
__weak ASIHTTPRequest *request = _request;
编辑:实际上上面的修复并没有解决调用代码 5 次导致 NULL 响应的问题。那个问题依然存在。问题消失的唯一方法是强烈捕获请求而不使用任何限定符。
现在的问题是为什么我的原始代码仍然有效..