我一直在构建一个HTTP客户端,它使用Web服务在客户端和服务器之间同步信息。我一直在使用Blocks和NSURLConnection在客户端实现这一点,但我在objc_msgSend()中频繁出现EXC_BAD_ACCESS崩溃。根据我的理解,这通常意味着已经调用了从堆栈中掉落的存储块。我认为我已正确编码以避免这种情况,但我仍然卡住了。
以下是我的代码在概念上的作用。它首先调用“synchronizeWithWebServer”。该方法调用“listRootObjectsOnServerWithBlock:”,它接受在方法返回时调用的块。
“listRootObjectsOnServersWithBlock:”异步启动到Web服务器的NSURLConnection。它期望在返回时调用块。在该块中,我希望能够执行原始块(因此恰当地命名为“块”)。
这只是我的代码的简化版本。真正的同步过程比较复杂,但它与下面的内容大致相同。
有时代码运行得很好,但是大约80%的时间它在例程中很早就崩溃了。当我的数据集变大时,它似乎更容易崩溃。
- (void)synchronizeWithWebServer
{
[self listRootObjectsOnServerWithBlock:^(NSArray *results, NSError *error) {
//Iterate over result objects and perform some other similar routines.
}];
}
- (void)listRootObjectsOnServerWithBlock:(void (^)(NSArray *results, NSError *error))block
{
//Create NSURLRequest Here
//Create connection asynchronously.
block = [block copy];
[NSURLConnection sendAsynchronousRequest:urlRequest
queue:[NSOperationQueue currentQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
//Parse response from web server (stored in NSData *data)
NSArray *results = .....
//Call 'block'
block(results, error);
[block release];
}];
}