这是在Objective-C中使用Blocks的有效方法吗?

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)