Car*_*ter 8 cocoa asynchronous objective-c grand-central-dispatch objective-c-blocks
我一直在构建一个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];
}];
}
Run Code Online (Sandbox Code Playgroud)